<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.owasp.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Achim</id>
		<title>OWASP - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.owasp.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Achim"/>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php/Special:Contributions/Achim"/>
		<updated>2026-05-27T03:34:14Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.27.2</generator>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256515</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256515"/>
				<updated>2019-12-29T19:42:16Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* --trace-sub +traceSUB */  removed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
=====Results=====&lt;br /&gt;
&lt;br /&gt;
:Results of checks are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.  This leaves the proper&lt;br /&gt;
:interpretation, if the result is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;, to the user.&lt;br /&gt;
:Background:  it is not always possible to rate a result as  &amp;quot;good&amp;quot; or&lt;br /&gt;
:&amp;quot;bad&amp;quot; or &amp;quot;insecure&amp;quot; or whatever. That's why  O-Saft  can not give the&lt;br /&gt;
:&amp;quot;the best&amp;quot; or a &amp;quot;proper&amp;quot; recommendation. In practice it depends on&lt;br /&gt;
:the context what a recommendation or countermeasure should be. That's&lt;br /&gt;
:why results are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  if considered &amp;quot;questionable&amp;quot;&lt;br /&gt;
:or &amp;quot;not good&amp;quot; (for example according other checks).&lt;br /&gt;
&lt;br /&gt;
:... more comming soon ...&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== Version 19.11.19 and later=====&lt;br /&gt;
&lt;br /&gt;
:Starting with version 19.11.19 the  +cipher  command does not use any&lt;br /&gt;
:external library. Checking for ciphers is done using plain Perl code.&lt;br /&gt;
:Only other collected SSL/TLS related information requires an external&lt;br /&gt;
:library, in general libssl.&lt;br /&gt;
:The description about OpenSSL and libssl below  applies only if any of&lt;br /&gt;
:to the options &amp;lt;code&amp;gt;--ciphermode=openssl&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--siphermode=ssleay&amp;lt;/code&amp;gt; are given&lt;br /&gt;
:with the &amp;lt;code&amp;gt;+cipher&amp;lt;/code&amp;gt; command.&lt;br /&gt;
&lt;br /&gt;
:Therefore following commands and options changed:&lt;br /&gt;
* &amp;lt;code&amp;gt;+cipher&amp;lt;/code&amp;gt;     uses internal method&lt;br /&gt;
* &amp;lt;code&amp;gt;+cipherall&amp;lt;/code&amp;gt;  command obsolete, automatically changed to  &amp;lt;code&amp;gt;+cipher&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;+cipherraw&amp;lt;/code&amp;gt;  command obsolete, automatically chnaged to  &amp;lt;code&amp;gt;+cipher&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;--openssl-ciphers&amp;lt;/code&amp;gt;  &amp;lt;code&amp;gt;--force-openssl&amp;lt;/code&amp;gt;  changed to  &amp;lt;code&amp;gt;--ciphermode=openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;--openssl=TOOL&amp;lt;/code&amp;gt;  TOOL only used for  &amp;lt;code&amp;gt;+cipher --ciphermode=openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;--legacy=owasp&amp;lt;/code&amp;gt;  option obsolete&lt;br /&gt;
&lt;br /&gt;
:The commands  &amp;lt;code&amp;gt;+cipherall&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+cipherraw&amp;lt;/code&amp;gt;  are &amp;quot;converted&amp;quot; to the new&lt;br /&gt;
:syntax, as follows:&lt;br /&gt;
&lt;br /&gt;
  VERSION &amp;lt; 19.11.19           VERSION &amp;gt; 19.11.19&lt;br /&gt;
  ----------------------------+-------------------------------&lt;br /&gt;
  +cipher                      +cipher --ciphermode=ssleay&lt;br /&gt;
  +cipher --force-openssl      +cipher --ciphermode=openssl&lt;br /&gt;
  +cipherall                   +cipher&lt;br /&gt;
  +cipherraw                   +cipher --ciphermode=intern&lt;br /&gt;
  ----------------------------+-------------------------------&lt;br /&gt;
&lt;br /&gt;
===== Version &amp;lt; 19.11.19=====&lt;br /&gt;
&lt;br /&gt;
:Up to version 19.11.19 the default behaviour for the  &amp;lt;code&amp;gt;+cipher&amp;lt;/code&amp;gt; command&lt;br /&gt;
:was to use libssl. The commands  &amp;lt;code&amp;gt;+cipherall&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+cipherraw&amp;lt;/code&amp;gt;  did not&lt;br /&gt;
:use any other library as described below.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --openssl-ciphers  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --openssl-cnf=PATH&lt;br /&gt;
:*  --openssl-s_client --s_client&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more information.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is useful  if the certificate and the configuration  must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --ciphermode=MODE======&lt;br /&gt;
&lt;br /&gt;
Following &amp;lt;code&amp;gt;MODE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
* &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt;    scan for ciphers using internal method; (default)&lt;br /&gt;
* &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt;   scan for ciphers using external openssl executable&lt;br /&gt;
* &amp;lt;code&amp;gt;ssleay&amp;lt;/code&amp;gt;    scan for ciphers using  IO::Socket  and  Net::SSLeay&lt;br /&gt;
* &amp;lt;code&amp;gt;dump&amp;lt;/code&amp;gt;      same as &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt; but print  all cipher informations,&lt;br /&gt;
:                         useful when postprocessed by contrib/* tools&lt;br /&gt;
&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; can be any string accepted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Useful if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. To start  ''o-saft.pl''  inside&lt;br /&gt;
:the Docker image, use following:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:or&lt;br /&gt;
   docker run --rm -it owasp/o-saft +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
====BUILD DOCKER IMAGE====&lt;br /&gt;
&lt;br /&gt;
:The Docker image can be installed as follows:&lt;br /&gt;
&lt;br /&gt;
   docker pull owasp/o-saft&lt;br /&gt;
&lt;br /&gt;
:The image can also easily be build from the Dockerfile (which is part&lt;br /&gt;
:of the distribution) as follows:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker build&lt;br /&gt;
&lt;br /&gt;
:To build the image from the Dockerfile with docker commands, see:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -n build&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
:These options behave like the command  +quit  and  do not perform any&lt;br /&gt;
:checks on the target(s).&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-maps======&lt;br /&gt;
:Print internal data strucures &amp;lt;code&amp;gt;%cfg{openssl}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%cfg{ssleay}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-subs======&lt;br /&gt;
:Print formatted list of internal functions with their description.&lt;br /&gt;
:Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-show======&lt;br /&gt;
:Print complete list of ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
====DOCUMENTATION====&lt;br /&gt;
&lt;br /&gt;
=====User Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation is mainly intented for the user, which is provided with&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
:But it may be difficult to find the proper information there.  To get&lt;br /&gt;
:more selective documentations, the  ''--help=*''  options can be used. To&lt;br /&gt;
:get an overview which  ''--help=*''  options are available, use:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:This only provides the complete user documentation, or the well known&lt;br /&gt;
:parts specified by the keyword, (HELP in example above).  To find any&lt;br /&gt;
:text with some lines of context, following could be used:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help | egrep -i -C 3 &amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:This is simply avaiable with:&lt;br /&gt;
&lt;br /&gt;
  o-saft -help=&amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:In the GUI a more sophisticate search is implemented, see the  &amp;quot;Help&amp;quot;&lt;br /&gt;
:window there:&lt;br /&gt;
&lt;br /&gt;
  o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
=====Developer Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation for developers is provided in various ways. Information&lt;br /&gt;
:for developers can be found found in:&lt;br /&gt;
&lt;br /&gt;
:* the files itself&lt;br /&gt;
&lt;br /&gt;
:* with:  &amp;lt;code&amp;gt;o-saft.pl --help=HELP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:* using:  &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 19.09.19&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256514</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256514"/>
				<updated>2019-12-29T19:39:36Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* Version 19.11.19 and later */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
=====Results=====&lt;br /&gt;
&lt;br /&gt;
:Results of checks are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.  This leaves the proper&lt;br /&gt;
:interpretation, if the result is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;, to the user.&lt;br /&gt;
:Background:  it is not always possible to rate a result as  &amp;quot;good&amp;quot; or&lt;br /&gt;
:&amp;quot;bad&amp;quot; or &amp;quot;insecure&amp;quot; or whatever. That's why  O-Saft  can not give the&lt;br /&gt;
:&amp;quot;the best&amp;quot; or a &amp;quot;proper&amp;quot; recommendation. In practice it depends on&lt;br /&gt;
:the context what a recommendation or countermeasure should be. That's&lt;br /&gt;
:why results are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  if considered &amp;quot;questionable&amp;quot;&lt;br /&gt;
:or &amp;quot;not good&amp;quot; (for example according other checks).&lt;br /&gt;
&lt;br /&gt;
:... more comming soon ...&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== Version 19.11.19 and later=====&lt;br /&gt;
&lt;br /&gt;
:Starting with version 19.11.19 the  +cipher  command does not use any&lt;br /&gt;
:external library. Checking for ciphers is done using plain Perl code.&lt;br /&gt;
:Only other collected SSL/TLS related information requires an external&lt;br /&gt;
:library, in general libssl.&lt;br /&gt;
:The description about OpenSSL and libssl below  applies only if any of&lt;br /&gt;
:to the options &amp;lt;code&amp;gt;--ciphermode=openssl&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--siphermode=ssleay&amp;lt;/code&amp;gt; are given&lt;br /&gt;
:with the &amp;lt;code&amp;gt;+cipher&amp;lt;/code&amp;gt; command.&lt;br /&gt;
&lt;br /&gt;
:Therefore following commands and options changed:&lt;br /&gt;
* &amp;lt;code&amp;gt;+cipher&amp;lt;/code&amp;gt;     uses internal method&lt;br /&gt;
* &amp;lt;code&amp;gt;+cipherall&amp;lt;/code&amp;gt;  command obsolete, automatically changed to  &amp;lt;code&amp;gt;+cipher&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;+cipherraw&amp;lt;/code&amp;gt;  command obsolete, automatically chnaged to  &amp;lt;code&amp;gt;+cipher&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;--openssl-ciphers&amp;lt;/code&amp;gt;  &amp;lt;code&amp;gt;--force-openssl&amp;lt;/code&amp;gt;  changed to  &amp;lt;code&amp;gt;--ciphermode=openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;--openssl=TOOL&amp;lt;/code&amp;gt;  TOOL only used for  &amp;lt;code&amp;gt;+cipher --ciphermode=openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;--legacy=owasp&amp;lt;/code&amp;gt;  option obsolete&lt;br /&gt;
&lt;br /&gt;
:The commands  &amp;lt;code&amp;gt;+cipherall&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+cipherraw&amp;lt;/code&amp;gt;  are &amp;quot;converted&amp;quot; to the new&lt;br /&gt;
:syntax, as follows:&lt;br /&gt;
&lt;br /&gt;
  VERSION &amp;lt; 19.11.19           VERSION &amp;gt; 19.11.19&lt;br /&gt;
  ----------------------------+-------------------------------&lt;br /&gt;
  +cipher                      +cipher --ciphermode=ssleay&lt;br /&gt;
  +cipher --force-openssl      +cipher --ciphermode=openssl&lt;br /&gt;
  +cipherall                   +cipher&lt;br /&gt;
  +cipherraw                   +cipher --ciphermode=intern&lt;br /&gt;
  ----------------------------+-------------------------------&lt;br /&gt;
&lt;br /&gt;
===== Version &amp;lt; 19.11.19=====&lt;br /&gt;
&lt;br /&gt;
:Up to version 19.11.19 the default behaviour for the  &amp;lt;code&amp;gt;+cipher&amp;lt;/code&amp;gt; command&lt;br /&gt;
:was to use libssl. The commands  &amp;lt;code&amp;gt;+cipherall&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+cipherraw&amp;lt;/code&amp;gt;  did not&lt;br /&gt;
:use any other library as described below.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --openssl-ciphers  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --openssl-cnf=PATH&lt;br /&gt;
:*  --openssl-s_client --s_client&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more information.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is useful  if the certificate and the configuration  must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --ciphermode=MODE======&lt;br /&gt;
&lt;br /&gt;
Following &amp;lt;code&amp;gt;MODE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
* &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt;    scan for ciphers using internal method; (default)&lt;br /&gt;
* &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt;   scan for ciphers using external openssl executable&lt;br /&gt;
* &amp;lt;code&amp;gt;ssleay&amp;lt;/code&amp;gt;    scan for ciphers using  IO::Socket  and  Net::SSLeay&lt;br /&gt;
* &amp;lt;code&amp;gt;dump&amp;lt;/code&amp;gt;      same as &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt; but print  all cipher informations,&lt;br /&gt;
:                         useful when postprocessed by contrib/* tools&lt;br /&gt;
&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; can be any string accepted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Useful if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. To start  ''o-saft.pl''  inside&lt;br /&gt;
:the Docker image, use following:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:or&lt;br /&gt;
   docker run --rm -it owasp/o-saft +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
====BUILD DOCKER IMAGE====&lt;br /&gt;
&lt;br /&gt;
:The Docker image can be installed as follows:&lt;br /&gt;
&lt;br /&gt;
   docker pull owasp/o-saft&lt;br /&gt;
&lt;br /&gt;
:The image can also easily be build from the Dockerfile (which is part&lt;br /&gt;
:of the distribution) as follows:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker build&lt;br /&gt;
&lt;br /&gt;
:To build the image from the Dockerfile with docker commands, see:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -n build&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
:These options behave like the command  +quit  and  do not perform any&lt;br /&gt;
:checks on the target(s).&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-maps======&lt;br /&gt;
:Print internal data strucures &amp;lt;code&amp;gt;%cfg{openssl}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%cfg{ssleay}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-subs======&lt;br /&gt;
:Print formatted list of internal functions with their description.&lt;br /&gt;
:Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-show======&lt;br /&gt;
:Print complete list of ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
====DOCUMENTATION====&lt;br /&gt;
&lt;br /&gt;
=====User Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation is mainly intented for the user, which is provided with&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
:But it may be difficult to find the proper information there.  To get&lt;br /&gt;
:more selective documentations, the  ''--help=*''  options can be used. To&lt;br /&gt;
:get an overview which  ''--help=*''  options are available, use:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:This only provides the complete user documentation, or the well known&lt;br /&gt;
:parts specified by the keyword, (HELP in example above).  To find any&lt;br /&gt;
:text with some lines of context, following could be used:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help | egrep -i -C 3 &amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:This is simply avaiable with:&lt;br /&gt;
&lt;br /&gt;
  o-saft -help=&amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:In the GUI a more sophisticate search is implemented, see the  &amp;quot;Help&amp;quot;&lt;br /&gt;
:window there:&lt;br /&gt;
&lt;br /&gt;
  o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
=====Developer Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation for developers is provided in various ways. Information&lt;br /&gt;
:for developers can be found found in:&lt;br /&gt;
&lt;br /&gt;
:* the files itself&lt;br /&gt;
&lt;br /&gt;
:* with:  &amp;lt;code&amp;gt;o-saft.pl --help=HELP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:* using:  &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 19.09.19&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256513</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256513"/>
				<updated>2019-12-29T19:38:52Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* Version 19.11.19 and later */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
=====Results=====&lt;br /&gt;
&lt;br /&gt;
:Results of checks are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.  This leaves the proper&lt;br /&gt;
:interpretation, if the result is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;, to the user.&lt;br /&gt;
:Background:  it is not always possible to rate a result as  &amp;quot;good&amp;quot; or&lt;br /&gt;
:&amp;quot;bad&amp;quot; or &amp;quot;insecure&amp;quot; or whatever. That's why  O-Saft  can not give the&lt;br /&gt;
:&amp;quot;the best&amp;quot; or a &amp;quot;proper&amp;quot; recommendation. In practice it depends on&lt;br /&gt;
:the context what a recommendation or countermeasure should be. That's&lt;br /&gt;
:why results are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  if considered &amp;quot;questionable&amp;quot;&lt;br /&gt;
:or &amp;quot;not good&amp;quot; (for example according other checks).&lt;br /&gt;
&lt;br /&gt;
:... more comming soon ...&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== Version 19.11.19 and later=====&lt;br /&gt;
&lt;br /&gt;
:Starting with version 19.11.19 the  +cipher  command does not use any&lt;br /&gt;
:external library. Checking for ciphers is done using plain Perl code.&lt;br /&gt;
:Only other collected SSL/TLS related information requires an external&lt;br /&gt;
:library, in general libssl.&lt;br /&gt;
:The description about OpenSSL and libssl below  applies only if any of&lt;br /&gt;
:to the options &amp;lt;code&amp;gt;--ciphermode=openssl&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--siphermode=ssleay&amp;lt;/code&amp;gt; are given&lt;br /&gt;
:with the &amp;lt;code&amp;gt;+cipher&amp;lt;/code&amp;gt; command.&lt;br /&gt;
&lt;br /&gt;
:Therefore following commands and options changed:&lt;br /&gt;
* &amp;lt;code&amp;gt;+cipher&amp;lt;/code&amp;gt;     uses internal method&lt;br /&gt;
* &amp;lt;code&amp;gt;+cipherall&amp;lt;/code&amp;gt;  command obsolete, automatically changed to  &amp;lt;code&amp;gt;+cipher&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;+cipherraw&amp;lt;/code&amp;gt;  command obsolete, automatically chnaged to  &amp;lt;code&amp;gt;+cipher&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;--openssl-ciphers&amp;lt;/code&amp;gt;  &amp;lt;code&amp;gt;--force-openssl&amp;lt;/code&amp;gt;  changed to  &amp;lt;code&amp;gt;--ciphermode=openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;--openssl=TOOL&amp;lt;/code&amp;gt;  TOOL only used for  &amp;lt;code&amp;gt;+cipher --ciphermode=openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;--legacy=owasp&amp;lt;/code&amp;gt;  option obsolete&lt;br /&gt;
&lt;br /&gt;
:The commands  &amp;lt;code&amp;gt;+cipherall&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+cipherraw&amp;lt;/code&amp;gt;  are &amp;quot;converted&amp;quot; to the new&lt;br /&gt;
:syntax, as follows:&lt;br /&gt;
&lt;br /&gt;
            VERSION &amp;lt; 19.11.19           VERSION &amp;gt; 19.11.19&lt;br /&gt;
            ----------------------------+-------------------------------&lt;br /&gt;
            +cipher                      +cipher --ciphermode=ssleay&lt;br /&gt;
            +cipher --force-openssl      +cipher --ciphermode=openssl&lt;br /&gt;
            +cipherall                   +cipher&lt;br /&gt;
            +cipherraw                   +cipher --ciphermode=intern&lt;br /&gt;
            ----------------------------+-------------------------------&lt;br /&gt;
&lt;br /&gt;
===== Version &amp;lt; 19.11.19=====&lt;br /&gt;
&lt;br /&gt;
:Up to version 19.11.19 the default behaviour for the  &amp;lt;code&amp;gt;+cipher&amp;lt;/code&amp;gt; command&lt;br /&gt;
:was to use libssl. The commands  &amp;lt;code&amp;gt;+cipherall&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+cipherraw&amp;lt;/code&amp;gt;  did not&lt;br /&gt;
:use any other library as described below.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --openssl-ciphers  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --openssl-cnf=PATH&lt;br /&gt;
:*  --openssl-s_client --s_client&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more information.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is useful  if the certificate and the configuration  must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --ciphermode=MODE======&lt;br /&gt;
&lt;br /&gt;
Following &amp;lt;code&amp;gt;MODE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
* &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt;    scan for ciphers using internal method; (default)&lt;br /&gt;
* &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt;   scan for ciphers using external openssl executable&lt;br /&gt;
* &amp;lt;code&amp;gt;ssleay&amp;lt;/code&amp;gt;    scan for ciphers using  IO::Socket  and  Net::SSLeay&lt;br /&gt;
* &amp;lt;code&amp;gt;dump&amp;lt;/code&amp;gt;      same as &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt; but print  all cipher informations,&lt;br /&gt;
:                         useful when postprocessed by contrib/* tools&lt;br /&gt;
&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; can be any string accepted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Useful if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. To start  ''o-saft.pl''  inside&lt;br /&gt;
:the Docker image, use following:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:or&lt;br /&gt;
   docker run --rm -it owasp/o-saft +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
====BUILD DOCKER IMAGE====&lt;br /&gt;
&lt;br /&gt;
:The Docker image can be installed as follows:&lt;br /&gt;
&lt;br /&gt;
   docker pull owasp/o-saft&lt;br /&gt;
&lt;br /&gt;
:The image can also easily be build from the Dockerfile (which is part&lt;br /&gt;
:of the distribution) as follows:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker build&lt;br /&gt;
&lt;br /&gt;
:To build the image from the Dockerfile with docker commands, see:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -n build&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
:These options behave like the command  +quit  and  do not perform any&lt;br /&gt;
:checks on the target(s).&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-maps======&lt;br /&gt;
:Print internal data strucures &amp;lt;code&amp;gt;%cfg{openssl}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%cfg{ssleay}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-subs======&lt;br /&gt;
:Print formatted list of internal functions with their description.&lt;br /&gt;
:Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-show======&lt;br /&gt;
:Print complete list of ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
====DOCUMENTATION====&lt;br /&gt;
&lt;br /&gt;
=====User Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation is mainly intented for the user, which is provided with&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
:But it may be difficult to find the proper information there.  To get&lt;br /&gt;
:more selective documentations, the  ''--help=*''  options can be used. To&lt;br /&gt;
:get an overview which  ''--help=*''  options are available, use:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:This only provides the complete user documentation, or the well known&lt;br /&gt;
:parts specified by the keyword, (HELP in example above).  To find any&lt;br /&gt;
:text with some lines of context, following could be used:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help | egrep -i -C 3 &amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:This is simply avaiable with:&lt;br /&gt;
&lt;br /&gt;
  o-saft -help=&amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:In the GUI a more sophisticate search is implemented, see the  &amp;quot;Help&amp;quot;&lt;br /&gt;
:window there:&lt;br /&gt;
&lt;br /&gt;
  o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
=====Developer Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation for developers is provided in various ways. Information&lt;br /&gt;
:for developers can be found found in:&lt;br /&gt;
&lt;br /&gt;
:* the files itself&lt;br /&gt;
&lt;br /&gt;
:* with:  &amp;lt;code&amp;gt;o-saft.pl --help=HELP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:* using:  &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 19.09.19&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256512</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256512"/>
				<updated>2019-12-29T19:35:12Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
=====Results=====&lt;br /&gt;
&lt;br /&gt;
:Results of checks are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.  This leaves the proper&lt;br /&gt;
:interpretation, if the result is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;, to the user.&lt;br /&gt;
:Background:  it is not always possible to rate a result as  &amp;quot;good&amp;quot; or&lt;br /&gt;
:&amp;quot;bad&amp;quot; or &amp;quot;insecure&amp;quot; or whatever. That's why  O-Saft  can not give the&lt;br /&gt;
:&amp;quot;the best&amp;quot; or a &amp;quot;proper&amp;quot; recommendation. In practice it depends on&lt;br /&gt;
:the context what a recommendation or countermeasure should be. That's&lt;br /&gt;
:why results are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  if considered &amp;quot;questionable&amp;quot;&lt;br /&gt;
:or &amp;quot;not good&amp;quot; (for example according other checks).&lt;br /&gt;
&lt;br /&gt;
:... more comming soon ...&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== Version 19.11.19 and later=====&lt;br /&gt;
&lt;br /&gt;
:Starting with version 19.11.19 the  +cipher  command does not use any&lt;br /&gt;
:external library. Checking for ciphers is done using plain Perl code.&lt;br /&gt;
:Only other collected SSL/TLS related information requires an external&lt;br /&gt;
:library, in general libssl.&lt;br /&gt;
:The description about OpenSSL and libssl below  applies only if any of&lt;br /&gt;
:to the options &amp;lt;code&amp;gt;--ciphermode=openssl&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--siphermode=ssleay&amp;lt;/code&amp;gt; are given&lt;br /&gt;
:with the &amp;lt;code&amp;gt;+cipher&amp;lt;/code&amp;gt; command only.&lt;br /&gt;
:The changed commands and options will be described soon ...&lt;br /&gt;
&lt;br /&gt;
===== Version &amp;lt; 19.11.19=====&lt;br /&gt;
&lt;br /&gt;
:Up to version 19.11.19 the default behaviour for the  &amp;lt;code&amp;gt;+cipher&amp;lt;/code&amp;gt; command&lt;br /&gt;
:was to use libssl. The commands  &amp;lt;code&amp;gt;+cipherall&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+cipherraw&amp;lt;/code&amp;gt;  did not&lt;br /&gt;
:use any other library as described below.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --openssl-ciphers  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --openssl-cnf=PATH&lt;br /&gt;
:*  --openssl-s_client --s_client&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more information.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is useful  if the certificate and the configuration  must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --ciphermode=MODE======&lt;br /&gt;
&lt;br /&gt;
Following &amp;lt;code&amp;gt;MODE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
* &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt;    scan for ciphers using internal method; (default)&lt;br /&gt;
* &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt;   scan for ciphers using external openssl executable&lt;br /&gt;
* &amp;lt;code&amp;gt;ssleay&amp;lt;/code&amp;gt;    scan for ciphers using  IO::Socket  and  Net::SSLeay&lt;br /&gt;
* &amp;lt;code&amp;gt;dump&amp;lt;/code&amp;gt;      same as &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt; but print  all cipher informations,&lt;br /&gt;
:                         useful when postprocessed by contrib/* tools&lt;br /&gt;
&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; can be any string accepted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Useful if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. To start  ''o-saft.pl''  inside&lt;br /&gt;
:the Docker image, use following:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:or&lt;br /&gt;
   docker run --rm -it owasp/o-saft +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
====BUILD DOCKER IMAGE====&lt;br /&gt;
&lt;br /&gt;
:The Docker image can be installed as follows:&lt;br /&gt;
&lt;br /&gt;
   docker pull owasp/o-saft&lt;br /&gt;
&lt;br /&gt;
:The image can also easily be build from the Dockerfile (which is part&lt;br /&gt;
:of the distribution) as follows:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker build&lt;br /&gt;
&lt;br /&gt;
:To build the image from the Dockerfile with docker commands, see:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -n build&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
:These options behave like the command  +quit  and  do not perform any&lt;br /&gt;
:checks on the target(s).&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-maps======&lt;br /&gt;
:Print internal data strucures &amp;lt;code&amp;gt;%cfg{openssl}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%cfg{ssleay}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-subs======&lt;br /&gt;
:Print formatted list of internal functions with their description.&lt;br /&gt;
:Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-show======&lt;br /&gt;
:Print complete list of ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
====DOCUMENTATION====&lt;br /&gt;
&lt;br /&gt;
=====User Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation is mainly intented for the user, which is provided with&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
:But it may be difficult to find the proper information there.  To get&lt;br /&gt;
:more selective documentations, the  ''--help=*''  options can be used. To&lt;br /&gt;
:get an overview which  ''--help=*''  options are available, use:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:This only provides the complete user documentation, or the well known&lt;br /&gt;
:parts specified by the keyword, (HELP in example above).  To find any&lt;br /&gt;
:text with some lines of context, following could be used:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help | egrep -i -C 3 &amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:This is simply avaiable with:&lt;br /&gt;
&lt;br /&gt;
  o-saft -help=&amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:In the GUI a more sophisticate search is implemented, see the  &amp;quot;Help&amp;quot;&lt;br /&gt;
:window there:&lt;br /&gt;
&lt;br /&gt;
  o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
=====Developer Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation for developers is provided in various ways. Information&lt;br /&gt;
:for developers can be found found in:&lt;br /&gt;
&lt;br /&gt;
:* the files itself&lt;br /&gt;
&lt;br /&gt;
:* with:  &amp;lt;code&amp;gt;o-saft.pl --help=HELP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:* using:  &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 19.09.19&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256511</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256511"/>
				<updated>2019-12-29T19:26:23Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* Results */ typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
=====Results=====&lt;br /&gt;
&lt;br /&gt;
:Results of checks are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.  This leaves the proper&lt;br /&gt;
:interpretation, if the result is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;, to the user.&lt;br /&gt;
:Background:  it is not always possible to rate a result as  &amp;quot;good&amp;quot; or&lt;br /&gt;
:&amp;quot;bad&amp;quot; or &amp;quot;insecure&amp;quot; or whatever. That's why  O-Saft  can not give the&lt;br /&gt;
:&amp;quot;the best&amp;quot; or a &amp;quot;proper&amp;quot; recommendation. In practice it depends on&lt;br /&gt;
:the context what a recommendation or countermeasure should be. That's&lt;br /&gt;
:why results are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  if considered &amp;quot;questionable&amp;quot;&lt;br /&gt;
:or &amp;quot;not good&amp;quot; (for example according other checks).&lt;br /&gt;
&lt;br /&gt;
:... more comming soon ...&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== Version 19.11.19 and later=====&lt;br /&gt;
&lt;br /&gt;
:Starting with version 19.11.19 the  +cipher  command does not use any&lt;br /&gt;
:external library. Checking for ciphers is done using plain Perl code.&lt;br /&gt;
:Only collected other SSL/TLS related information requires an external&lt;br /&gt;
:library, in general libssl.&lt;br /&gt;
:The description about OpenSSL and libssl below  applys to the command&lt;br /&gt;
:&amp;lt;code&amp;gt;+cipher-openssl&amp;lt;/code&amp;gt; only.&lt;br /&gt;
:The changed commands and options will be described soon ...&lt;br /&gt;
&lt;br /&gt;
===== Version &amp;lt; 19.11.19=====&lt;br /&gt;
&lt;br /&gt;
:Up to version 19.11.19 the default behaviour for the  &amp;lt;code&amp;gt;+cipher&amp;lt;/code&amp;gt; command&lt;br /&gt;
:was to use libssl. The commands  &amp;lt;code&amp;gt;+cipherall&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+cipherraw&amp;lt;/code&amp;gt;  did not&lt;br /&gt;
:use any other library as described below.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --openssl-ciphers  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --openssl-cnf=PATH&lt;br /&gt;
:*  --openssl-s_client --s_client&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more information.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is useful  if the certificate and the configuration  must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --ciphermode=MODE======&lt;br /&gt;
&lt;br /&gt;
Following &amp;lt;code&amp;gt;MODE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
* &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt;    scan for ciphers using internal method; (default)&lt;br /&gt;
* &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt;   scan for ciphers using external openssl executable&lt;br /&gt;
* &amp;lt;code&amp;gt;ssleay&amp;lt;/code&amp;gt;    scan for ciphers using  IO::Socket  and  Net::SSLeay&lt;br /&gt;
* &amp;lt;code&amp;gt;dump&amp;lt;/code&amp;gt;      same as &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt; but print  all cipher informations,&lt;br /&gt;
:                         useful when postprocessed by contrib/* tools&lt;br /&gt;
&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; can be any string accepted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Useful if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. To start  ''o-saft.pl''  inside&lt;br /&gt;
:the Docker image, use following:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:or&lt;br /&gt;
   docker run --rm -it owasp/o-saft +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
====BUILD DOCKER IMAGE====&lt;br /&gt;
&lt;br /&gt;
:The Docker image can be installed as follows:&lt;br /&gt;
&lt;br /&gt;
   docker pull owasp/o-saft&lt;br /&gt;
&lt;br /&gt;
:The image can also easily be build from the Dockerfile (which is part&lt;br /&gt;
:of the distribution) as follows:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker build&lt;br /&gt;
&lt;br /&gt;
:To build the image from the Dockerfile with docker commands, see:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -n build&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
:These options behave like the command  +quit  and  do not perform any&lt;br /&gt;
:checks on the target(s).&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-maps======&lt;br /&gt;
:Print internal data strucures &amp;lt;code&amp;gt;%cfg{openssl}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%cfg{ssleay}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-subs======&lt;br /&gt;
:Print formatted list of internal functions with their description.&lt;br /&gt;
:Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-show======&lt;br /&gt;
:Print complete list of ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
====DOCUMENTATION====&lt;br /&gt;
&lt;br /&gt;
=====User Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation is mainly intented for the user, which is provided with&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
:But it may be difficult to find the proper information there.  To get&lt;br /&gt;
:more selective documentations, the  ''--help=*''  options can be used. To&lt;br /&gt;
:get an overview which  ''--help=*''  options are available, use:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:This only provides the complete user documentation, or the well known&lt;br /&gt;
:parts specified by the keyword, (HELP in example above).  To find any&lt;br /&gt;
:text with some lines of context, following could be used:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help | egrep -i -C 3 &amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:This is simply avaiable with:&lt;br /&gt;
&lt;br /&gt;
  o-saft -help=&amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:In the GUI a more sophisticate search is implemented, see the  &amp;quot;Help&amp;quot;&lt;br /&gt;
:window there:&lt;br /&gt;
&lt;br /&gt;
  o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
=====Developer Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation for developers is provided in various ways. Information&lt;br /&gt;
:for developers can be found found in:&lt;br /&gt;
&lt;br /&gt;
:* the files itself&lt;br /&gt;
&lt;br /&gt;
:* with:  &amp;lt;code&amp;gt;o-saft.pl --help=HELP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:* using:  &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 19.09.19&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256510</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256510"/>
				<updated>2019-12-29T19:24:05Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* Results */ typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
=====Results=====&lt;br /&gt;
&lt;br /&gt;
:Results of checks are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.  This leaves the proper&lt;br /&gt;
:interpretation, if the result is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;, to the user.&lt;br /&gt;
:Background:  it is not always possible to rate a result as  &amp;quot;good&amp;quot; or&lt;br /&gt;
:&amp;quot;bad&amp;quot; or &amp;quot;insecure&amp;quot; or whatever. That's why  O-Saft  can not give the&lt;br /&gt;
:&amp;quot;the best&amp;quot; or a &amp;quot;proper&amp;quot; recommendation. In practice it depends on&lt;br /&gt;
:the context what a recomendation, or countermeasure should be. That's&lt;br /&gt;
:why results are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  if considered &amp;quot;questionable&amp;quot;&lt;br /&gt;
:or &amp;quot;not good&amp;quot; (for example according other checks).&lt;br /&gt;
&lt;br /&gt;
:... more comming soon ...&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== Version 19.11.19 and later=====&lt;br /&gt;
&lt;br /&gt;
:Starting with version 19.11.19 the  +cipher  command does not use any&lt;br /&gt;
:external library. Checking for ciphers is done using plain Perl code.&lt;br /&gt;
:Only collected other SSL/TLS related information requires an external&lt;br /&gt;
:library, in general libssl.&lt;br /&gt;
:The description about OpenSSL and libssl below  applys to the command&lt;br /&gt;
:&amp;lt;code&amp;gt;+cipher-openssl&amp;lt;/code&amp;gt; only.&lt;br /&gt;
:The changed commands and options will be described soon ...&lt;br /&gt;
&lt;br /&gt;
===== Version &amp;lt; 19.11.19=====&lt;br /&gt;
&lt;br /&gt;
:Up to version 19.11.19 the default behaviour for the  &amp;lt;code&amp;gt;+cipher&amp;lt;/code&amp;gt; command&lt;br /&gt;
:was to use libssl. The commands  &amp;lt;code&amp;gt;+cipherall&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+cipherraw&amp;lt;/code&amp;gt;  did not&lt;br /&gt;
:use any other library as described below.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --openssl-ciphers  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --openssl-cnf=PATH&lt;br /&gt;
:*  --openssl-s_client --s_client&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more information.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is useful  if the certificate and the configuration  must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --ciphermode=MODE======&lt;br /&gt;
&lt;br /&gt;
Following &amp;lt;code&amp;gt;MODE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
* &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt;    scan for ciphers using internal method; (default)&lt;br /&gt;
* &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt;   scan for ciphers using external openssl executable&lt;br /&gt;
* &amp;lt;code&amp;gt;ssleay&amp;lt;/code&amp;gt;    scan for ciphers using  IO::Socket  and  Net::SSLeay&lt;br /&gt;
* &amp;lt;code&amp;gt;dump&amp;lt;/code&amp;gt;      same as &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt; but print  all cipher informations,&lt;br /&gt;
:                         useful when postprocessed by contrib/* tools&lt;br /&gt;
&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; can be any string accepted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Useful if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. To start  ''o-saft.pl''  inside&lt;br /&gt;
:the Docker image, use following:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:or&lt;br /&gt;
   docker run --rm -it owasp/o-saft +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
====BUILD DOCKER IMAGE====&lt;br /&gt;
&lt;br /&gt;
:The Docker image can be installed as follows:&lt;br /&gt;
&lt;br /&gt;
   docker pull owasp/o-saft&lt;br /&gt;
&lt;br /&gt;
:The image can also easily be build from the Dockerfile (which is part&lt;br /&gt;
:of the distribution) as follows:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker build&lt;br /&gt;
&lt;br /&gt;
:To build the image from the Dockerfile with docker commands, see:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -n build&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
:These options behave like the command  +quit  and  do not perform any&lt;br /&gt;
:checks on the target(s).&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-maps======&lt;br /&gt;
:Print internal data strucures &amp;lt;code&amp;gt;%cfg{openssl}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%cfg{ssleay}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-subs======&lt;br /&gt;
:Print formatted list of internal functions with their description.&lt;br /&gt;
:Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-show======&lt;br /&gt;
:Print complete list of ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
====DOCUMENTATION====&lt;br /&gt;
&lt;br /&gt;
=====User Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation is mainly intented for the user, which is provided with&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
:But it may be difficult to find the proper information there.  To get&lt;br /&gt;
:more selective documentations, the  ''--help=*''  options can be used. To&lt;br /&gt;
:get an overview which  ''--help=*''  options are available, use:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:This only provides the complete user documentation, or the well known&lt;br /&gt;
:parts specified by the keyword, (HELP in example above).  To find any&lt;br /&gt;
:text with some lines of context, following could be used:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help | egrep -i -C 3 &amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:This is simply avaiable with:&lt;br /&gt;
&lt;br /&gt;
  o-saft -help=&amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:In the GUI a more sophisticate search is implemented, see the  &amp;quot;Help&amp;quot;&lt;br /&gt;
:window there:&lt;br /&gt;
&lt;br /&gt;
  o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
=====Developer Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation for developers is provided in various ways. Information&lt;br /&gt;
:for developers can be found found in:&lt;br /&gt;
&lt;br /&gt;
:* the files itself&lt;br /&gt;
&lt;br /&gt;
:* with:  &amp;lt;code&amp;gt;o-saft.pl --help=HELP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:* using:  &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 19.09.19&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256509</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256509"/>
				<updated>2019-12-29T19:21:31Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* Version 19.11.19 and later */ typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
=====Results=====&lt;br /&gt;
&lt;br /&gt;
:Results of checks are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.  This leaves the proper&lt;br /&gt;
:interpretation, if the result is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;, to the user.&lt;br /&gt;
:Background:  it is not always possible to rate a result as  &amp;quot;good&amp;quot; or&lt;br /&gt;
:&amp;quot;bad&amp;quot; or &amp;quot;insecure&amp;quot; or whatever. That's why  O-Saft  can not give the&lt;br /&gt;
:&amp;quot;the best&amp;quot; or a &amp;quot;proper&amp;quot; recomendation. In practice it depends on the&lt;br /&gt;
:context what a recomendation, or countermeasure should be. That's why&lt;br /&gt;
:all results are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  if considered &amp;quot;questionable&amp;quot;&lt;br /&gt;
:or &amp;quot;not good&amp;quot; (for example according other checks).&lt;br /&gt;
&lt;br /&gt;
:... more comming soon ...&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== Version 19.11.19 and later=====&lt;br /&gt;
&lt;br /&gt;
:Starting with version 19.11.19 the  +cipher  command does not use any&lt;br /&gt;
:external library. Checking for ciphers is done using plain Perl code.&lt;br /&gt;
:Only collected other SSL/TLS related information requires an external&lt;br /&gt;
:library, in general libssl.&lt;br /&gt;
:The description about OpenSSL and libssl below  applys to the command&lt;br /&gt;
:&amp;lt;code&amp;gt;+cipher-openssl&amp;lt;/code&amp;gt; only.&lt;br /&gt;
:The changed commands and options will be described soon ...&lt;br /&gt;
&lt;br /&gt;
===== Version &amp;lt; 19.11.19=====&lt;br /&gt;
&lt;br /&gt;
:Up to version 19.11.19 the default behaviour for the  &amp;lt;code&amp;gt;+cipher&amp;lt;/code&amp;gt; command&lt;br /&gt;
:was to use libssl. The commands  &amp;lt;code&amp;gt;+cipherall&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+cipherraw&amp;lt;/code&amp;gt;  did not&lt;br /&gt;
:use any other library as described below.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --openssl-ciphers  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --openssl-cnf=PATH&lt;br /&gt;
:*  --openssl-s_client --s_client&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more information.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is useful  if the certificate and the configuration  must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --ciphermode=MODE======&lt;br /&gt;
&lt;br /&gt;
Following &amp;lt;code&amp;gt;MODE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
* &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt;    scan for ciphers using internal method; (default)&lt;br /&gt;
* &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt;   scan for ciphers using external openssl executable&lt;br /&gt;
* &amp;lt;code&amp;gt;ssleay&amp;lt;/code&amp;gt;    scan for ciphers using  IO::Socket  and  Net::SSLeay&lt;br /&gt;
* &amp;lt;code&amp;gt;dump&amp;lt;/code&amp;gt;      same as &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt; but print  all cipher informations,&lt;br /&gt;
:                         useful when postprocessed by contrib/* tools&lt;br /&gt;
&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; can be any string accepted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Useful if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. To start  ''o-saft.pl''  inside&lt;br /&gt;
:the Docker image, use following:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:or&lt;br /&gt;
   docker run --rm -it owasp/o-saft +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
====BUILD DOCKER IMAGE====&lt;br /&gt;
&lt;br /&gt;
:The Docker image can be installed as follows:&lt;br /&gt;
&lt;br /&gt;
   docker pull owasp/o-saft&lt;br /&gt;
&lt;br /&gt;
:The image can also easily be build from the Dockerfile (which is part&lt;br /&gt;
:of the distribution) as follows:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker build&lt;br /&gt;
&lt;br /&gt;
:To build the image from the Dockerfile with docker commands, see:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -n build&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
:These options behave like the command  +quit  and  do not perform any&lt;br /&gt;
:checks on the target(s).&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-maps======&lt;br /&gt;
:Print internal data strucures &amp;lt;code&amp;gt;%cfg{openssl}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%cfg{ssleay}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-subs======&lt;br /&gt;
:Print formatted list of internal functions with their description.&lt;br /&gt;
:Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-show======&lt;br /&gt;
:Print complete list of ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
====DOCUMENTATION====&lt;br /&gt;
&lt;br /&gt;
=====User Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation is mainly intented for the user, which is provided with&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
:But it may be difficult to find the proper information there.  To get&lt;br /&gt;
:more selective documentations, the  ''--help=*''  options can be used. To&lt;br /&gt;
:get an overview which  ''--help=*''  options are available, use:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:This only provides the complete user documentation, or the well known&lt;br /&gt;
:parts specified by the keyword, (HELP in example above).  To find any&lt;br /&gt;
:text with some lines of context, following could be used:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help | egrep -i -C 3 &amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:This is simply avaiable with:&lt;br /&gt;
&lt;br /&gt;
  o-saft -help=&amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:In the GUI a more sophisticate search is implemented, see the  &amp;quot;Help&amp;quot;&lt;br /&gt;
:window there:&lt;br /&gt;
&lt;br /&gt;
  o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
=====Developer Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation for developers is provided in various ways. Information&lt;br /&gt;
:for developers can be found found in:&lt;br /&gt;
&lt;br /&gt;
:* the files itself&lt;br /&gt;
&lt;br /&gt;
:* with:  &amp;lt;code&amp;gt;o-saft.pl --help=HELP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:* using:  &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 19.09.19&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256508</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256508"/>
				<updated>2019-12-29T19:20:33Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* Requirements */ typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
=====Results=====&lt;br /&gt;
&lt;br /&gt;
:Results of checks are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.  This leaves the proper&lt;br /&gt;
:interpretation, if the result is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;, to the user.&lt;br /&gt;
:Background:  it is not always possible to rate a result as  &amp;quot;good&amp;quot; or&lt;br /&gt;
:&amp;quot;bad&amp;quot; or &amp;quot;insecure&amp;quot; or whatever. That's why  O-Saft  can not give the&lt;br /&gt;
:&amp;quot;the best&amp;quot; or a &amp;quot;proper&amp;quot; recomendation. In practice it depends on the&lt;br /&gt;
:context what a recomendation, or countermeasure should be. That's why&lt;br /&gt;
:all results are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  if considered &amp;quot;questionable&amp;quot;&lt;br /&gt;
:or &amp;quot;not good&amp;quot; (for example according other checks).&lt;br /&gt;
&lt;br /&gt;
:... more comming soon ...&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== Version 19.11.19 and later=====&lt;br /&gt;
&lt;br /&gt;
:Starting with version 19.11.19 the  +cipher  command does not use any&lt;br /&gt;
:external library. Checking for ciphers is done using plain Perl code.&lt;br /&gt;
:Only collected other SSL/TLS related inofrmation requires an external&lt;br /&gt;
:library, in general libssl.&lt;br /&gt;
:The description about OpenSSL and libssl below  applys to the command&lt;br /&gt;
:&amp;lt;code&amp;gt;+cipher-openssl&amp;lt;/code&amp;gt; only.&lt;br /&gt;
:The changed commands and options will be described soon ...&lt;br /&gt;
&lt;br /&gt;
===== Version &amp;lt; 19.11.19=====&lt;br /&gt;
&lt;br /&gt;
:Up to version 19.11.19 the default behaviour for the  &amp;lt;code&amp;gt;+cipher&amp;lt;/code&amp;gt; command&lt;br /&gt;
:was to use libssl. The commands  &amp;lt;code&amp;gt;+cipherall&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+cipherraw&amp;lt;/code&amp;gt;  did not&lt;br /&gt;
:use any other library as described below.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --openssl-ciphers  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --openssl-cnf=PATH&lt;br /&gt;
:*  --openssl-s_client --s_client&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more information.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is useful  if the certificate and the configuration  must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --ciphermode=MODE======&lt;br /&gt;
&lt;br /&gt;
Following &amp;lt;code&amp;gt;MODE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
* &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt;    scan for ciphers using internal method; (default)&lt;br /&gt;
* &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt;   scan for ciphers using external openssl executable&lt;br /&gt;
* &amp;lt;code&amp;gt;ssleay&amp;lt;/code&amp;gt;    scan for ciphers using  IO::Socket  and  Net::SSLeay&lt;br /&gt;
* &amp;lt;code&amp;gt;dump&amp;lt;/code&amp;gt;      same as &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt; but print  all cipher informations,&lt;br /&gt;
:                         useful when postprocessed by contrib/* tools&lt;br /&gt;
&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; can be any string accepted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Useful if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. To start  ''o-saft.pl''  inside&lt;br /&gt;
:the Docker image, use following:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:or&lt;br /&gt;
   docker run --rm -it owasp/o-saft +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
====BUILD DOCKER IMAGE====&lt;br /&gt;
&lt;br /&gt;
:The Docker image can be installed as follows:&lt;br /&gt;
&lt;br /&gt;
   docker pull owasp/o-saft&lt;br /&gt;
&lt;br /&gt;
:The image can also easily be build from the Dockerfile (which is part&lt;br /&gt;
:of the distribution) as follows:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker build&lt;br /&gt;
&lt;br /&gt;
:To build the image from the Dockerfile with docker commands, see:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -n build&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
:These options behave like the command  +quit  and  do not perform any&lt;br /&gt;
:checks on the target(s).&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-maps======&lt;br /&gt;
:Print internal data strucures &amp;lt;code&amp;gt;%cfg{openssl}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%cfg{ssleay}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-subs======&lt;br /&gt;
:Print formatted list of internal functions with their description.&lt;br /&gt;
:Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-show======&lt;br /&gt;
:Print complete list of ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
====DOCUMENTATION====&lt;br /&gt;
&lt;br /&gt;
=====User Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation is mainly intented for the user, which is provided with&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
:But it may be difficult to find the proper information there.  To get&lt;br /&gt;
:more selective documentations, the  ''--help=*''  options can be used. To&lt;br /&gt;
:get an overview which  ''--help=*''  options are available, use:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:This only provides the complete user documentation, or the well known&lt;br /&gt;
:parts specified by the keyword, (HELP in example above).  To find any&lt;br /&gt;
:text with some lines of context, following could be used:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help | egrep -i -C 3 &amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:This is simply avaiable with:&lt;br /&gt;
&lt;br /&gt;
  o-saft -help=&amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:In the GUI a more sophisticate search is implemented, see the  &amp;quot;Help&amp;quot;&lt;br /&gt;
:window there:&lt;br /&gt;
&lt;br /&gt;
  o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
=====Developer Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation for developers is provided in various ways. Information&lt;br /&gt;
:for developers can be found found in:&lt;br /&gt;
&lt;br /&gt;
:* the files itself&lt;br /&gt;
&lt;br /&gt;
:* with:  &amp;lt;code&amp;gt;o-saft.pl --help=HELP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:* using:  &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 19.09.19&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256507</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256507"/>
				<updated>2019-12-29T19:18:14Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: --test-cipher-show added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
=====Results=====&lt;br /&gt;
&lt;br /&gt;
:Results of checks are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.  This leaves the proper&lt;br /&gt;
:interpretation, if the result is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;, to the user.&lt;br /&gt;
:Background:  it is not always possible to rate a result as  &amp;quot;good&amp;quot; or&lt;br /&gt;
:&amp;quot;bad&amp;quot; or &amp;quot;insecure&amp;quot; or whatever. That's why  O-Saft  can not give the&lt;br /&gt;
:&amp;quot;the best&amp;quot; or a &amp;quot;proper&amp;quot; recomendation. In practice it depends on the&lt;br /&gt;
:context what a recomendation, or countermeasure should be. That's why&lt;br /&gt;
:all results are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  if considered &amp;quot;questionable&amp;quot;&lt;br /&gt;
:or &amp;quot;not good&amp;quot; (for example according other checks).&lt;br /&gt;
&lt;br /&gt;
:... more comming soon ...&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== Version 19.11.19 and later=====&lt;br /&gt;
&lt;br /&gt;
:Starting with version 19.11.19 the  +cipher  command does not use any&lt;br /&gt;
:external library. Checking for ciphers is done using plain Perl code.&lt;br /&gt;
:Only collected other SSL/TLS related inofrmation requires an external&lt;br /&gt;
:library, in general libssl.&lt;br /&gt;
:The description about OpenSSL and libssl below  applys to the command&lt;br /&gt;
:&amp;lt;code&amp;gt;+cipher-openssl&amp;lt;/code&amp;gt; only.&lt;br /&gt;
:The changed commands and options will be described soon ...&lt;br /&gt;
&lt;br /&gt;
===== Version &amp;lt; 19.11.19=====&lt;br /&gt;
&lt;br /&gt;
:Up to version 19.11.19 the default behaviour for the  &amp;lt;code&amp;gt;+cipher&amp;lt;/code&amp;gt; command&lt;br /&gt;
:was to use libssl. The commands  &amp;lt;code&amp;gt;+cipherall&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+cipherraw&amp;lt;/code&amp;gt;  did not&lt;br /&gt;
:use any other library as described below.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --openssl-ciphers  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --openssl-cnf=PATH&lt;br /&gt;
:*  --openssl-s_client --s_client&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is useful  if the certificate and the configuration  must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --ciphermode=MODE======&lt;br /&gt;
&lt;br /&gt;
Following &amp;lt;code&amp;gt;MODE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
* &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt;    scan for ciphers using internal method; (default)&lt;br /&gt;
* &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt;   scan for ciphers using external openssl executable&lt;br /&gt;
* &amp;lt;code&amp;gt;ssleay&amp;lt;/code&amp;gt;    scan for ciphers using  IO::Socket  and  Net::SSLeay&lt;br /&gt;
* &amp;lt;code&amp;gt;dump&amp;lt;/code&amp;gt;      same as &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt; but print  all cipher informations,&lt;br /&gt;
:                         useful when postprocessed by contrib/* tools&lt;br /&gt;
&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; can be any string accepted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Useful if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. To start  ''o-saft.pl''  inside&lt;br /&gt;
:the Docker image, use following:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:or&lt;br /&gt;
   docker run --rm -it owasp/o-saft +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
====BUILD DOCKER IMAGE====&lt;br /&gt;
&lt;br /&gt;
:The Docker image can be installed as follows:&lt;br /&gt;
&lt;br /&gt;
   docker pull owasp/o-saft&lt;br /&gt;
&lt;br /&gt;
:The image can also easily be build from the Dockerfile (which is part&lt;br /&gt;
:of the distribution) as follows:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker build&lt;br /&gt;
&lt;br /&gt;
:To build the image from the Dockerfile with docker commands, see:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -n build&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
:These options behave like the command  +quit  and  do not perform any&lt;br /&gt;
:checks on the target(s).&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-maps======&lt;br /&gt;
:Print internal data strucures &amp;lt;code&amp;gt;%cfg{openssl}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%cfg{ssleay}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-subs======&lt;br /&gt;
:Print formatted list of internal functions with their description.&lt;br /&gt;
:Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-show======&lt;br /&gt;
:Print complete list of ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
====DOCUMENTATION====&lt;br /&gt;
&lt;br /&gt;
=====User Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation is mainly intented for the user, which is provided with&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
:But it may be difficult to find the proper information there.  To get&lt;br /&gt;
:more selective documentations, the  ''--help=*''  options can be used. To&lt;br /&gt;
:get an overview which  ''--help=*''  options are available, use:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:This only provides the complete user documentation, or the well known&lt;br /&gt;
:parts specified by the keyword, (HELP in example above).  To find any&lt;br /&gt;
:text with some lines of context, following could be used:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help | egrep -i -C 3 &amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:This is simply avaiable with:&lt;br /&gt;
&lt;br /&gt;
  o-saft -help=&amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:In the GUI a more sophisticate search is implemented, see the  &amp;quot;Help&amp;quot;&lt;br /&gt;
:window there:&lt;br /&gt;
&lt;br /&gt;
  o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
=====Developer Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation for developers is provided in various ways. Information&lt;br /&gt;
:for developers can be found found in:&lt;br /&gt;
&lt;br /&gt;
:* the files itself&lt;br /&gt;
&lt;br /&gt;
:* with:  &amp;lt;code&amp;gt;o-saft.pl --help=HELP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:* using:  &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 19.09.19&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256506</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256506"/>
				<updated>2019-12-29T19:17:22Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* Internal testing */  improved&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
=====Results=====&lt;br /&gt;
&lt;br /&gt;
:Results of checks are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.  This leaves the proper&lt;br /&gt;
:interpretation, if the result is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;, to the user.&lt;br /&gt;
:Background:  it is not always possible to rate a result as  &amp;quot;good&amp;quot; or&lt;br /&gt;
:&amp;quot;bad&amp;quot; or &amp;quot;insecure&amp;quot; or whatever. That's why  O-Saft  can not give the&lt;br /&gt;
:&amp;quot;the best&amp;quot; or a &amp;quot;proper&amp;quot; recomendation. In practice it depends on the&lt;br /&gt;
:context what a recomendation, or countermeasure should be. That's why&lt;br /&gt;
:all results are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  if considered &amp;quot;questionable&amp;quot;&lt;br /&gt;
:or &amp;quot;not good&amp;quot; (for example according other checks).&lt;br /&gt;
&lt;br /&gt;
:... more comming soon ...&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== Version 19.11.19 and later=====&lt;br /&gt;
&lt;br /&gt;
:Starting with version 19.11.19 the  +cipher  command does not use any&lt;br /&gt;
:external library. Checking for ciphers is done using plain Perl code.&lt;br /&gt;
:Only collected other SSL/TLS related inofrmation requires an external&lt;br /&gt;
:library, in general libssl.&lt;br /&gt;
:The description about OpenSSL and libssl below  applys to the command&lt;br /&gt;
:&amp;lt;code&amp;gt;+cipher-openssl&amp;lt;/code&amp;gt; only.&lt;br /&gt;
:The changed commands and options will be described soon ...&lt;br /&gt;
&lt;br /&gt;
===== Version &amp;lt; 19.11.19=====&lt;br /&gt;
&lt;br /&gt;
:Up to version 19.11.19 the default behaviour for the  &amp;lt;code&amp;gt;+cipher&amp;lt;/code&amp;gt; command&lt;br /&gt;
:was to use libssl. The commands  &amp;lt;code&amp;gt;+cipherall&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+cipherraw&amp;lt;/code&amp;gt;  did not&lt;br /&gt;
:use any other library as described below.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --openssl-ciphers  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --openssl-cnf=PATH&lt;br /&gt;
:*  --openssl-s_client --s_client&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is useful  if the certificate and the configuration  must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --ciphermode=MODE======&lt;br /&gt;
&lt;br /&gt;
Following &amp;lt;code&amp;gt;MODE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
* &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt;    scan for ciphers using internal method; (default)&lt;br /&gt;
* &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt;   scan for ciphers using external openssl executable&lt;br /&gt;
* &amp;lt;code&amp;gt;ssleay&amp;lt;/code&amp;gt;    scan for ciphers using  IO::Socket  and  Net::SSLeay&lt;br /&gt;
* &amp;lt;code&amp;gt;dump&amp;lt;/code&amp;gt;      same as &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt; but print  all cipher informations,&lt;br /&gt;
:                         useful when postprocessed by contrib/* tools&lt;br /&gt;
&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; can be any string accepted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Useful if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. To start  ''o-saft.pl''  inside&lt;br /&gt;
:the Docker image, use following:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:or&lt;br /&gt;
   docker run --rm -it owasp/o-saft +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
====BUILD DOCKER IMAGE====&lt;br /&gt;
&lt;br /&gt;
:The Docker image can be installed as follows:&lt;br /&gt;
&lt;br /&gt;
   docker pull owasp/o-saft&lt;br /&gt;
&lt;br /&gt;
:The image can also easily be build from the Dockerfile (which is part&lt;br /&gt;
:of the distribution) as follows:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker build&lt;br /&gt;
&lt;br /&gt;
:To build the image from the Dockerfile with docker commands, see:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -n build&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
:These options behave like the command  +quit  and  do not perform any&lt;br /&gt;
:checks on the target(s).&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-maps======&lt;br /&gt;
:Print internal data strucures &amp;lt;code&amp;gt;%cfg{openssl}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%cfg{ssleay}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-subs======&lt;br /&gt;
:Print formatted list of internal functions with their description.&lt;br /&gt;
:Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
====DOCUMENTATION====&lt;br /&gt;
&lt;br /&gt;
=====User Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation is mainly intented for the user, which is provided with&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
:But it may be difficult to find the proper information there.  To get&lt;br /&gt;
:more selective documentations, the  ''--help=*''  options can be used. To&lt;br /&gt;
:get an overview which  ''--help=*''  options are available, use:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:This only provides the complete user documentation, or the well known&lt;br /&gt;
:parts specified by the keyword, (HELP in example above).  To find any&lt;br /&gt;
:text with some lines of context, following could be used:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help | egrep -i -C 3 &amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:This is simply avaiable with:&lt;br /&gt;
&lt;br /&gt;
  o-saft -help=&amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:In the GUI a more sophisticate search is implemented, see the  &amp;quot;Help&amp;quot;&lt;br /&gt;
:window there:&lt;br /&gt;
&lt;br /&gt;
  o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
=====Developer Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation for developers is provided in various ways. Information&lt;br /&gt;
:for developers can be found found in:&lt;br /&gt;
&lt;br /&gt;
:* the files itself&lt;br /&gt;
&lt;br /&gt;
:* with:  &amp;lt;code&amp;gt;o-saft.pl --help=HELP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:* using:  &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 19.09.19&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256505</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256505"/>
				<updated>2019-12-29T19:16:38Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: --test-subs added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
=====Results=====&lt;br /&gt;
&lt;br /&gt;
:Results of checks are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.  This leaves the proper&lt;br /&gt;
:interpretation, if the result is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;, to the user.&lt;br /&gt;
:Background:  it is not always possible to rate a result as  &amp;quot;good&amp;quot; or&lt;br /&gt;
:&amp;quot;bad&amp;quot; or &amp;quot;insecure&amp;quot; or whatever. That's why  O-Saft  can not give the&lt;br /&gt;
:&amp;quot;the best&amp;quot; or a &amp;quot;proper&amp;quot; recomendation. In practice it depends on the&lt;br /&gt;
:context what a recomendation, or countermeasure should be. That's why&lt;br /&gt;
:all results are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  if considered &amp;quot;questionable&amp;quot;&lt;br /&gt;
:or &amp;quot;not good&amp;quot; (for example according other checks).&lt;br /&gt;
&lt;br /&gt;
:... more comming soon ...&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== Version 19.11.19 and later=====&lt;br /&gt;
&lt;br /&gt;
:Starting with version 19.11.19 the  +cipher  command does not use any&lt;br /&gt;
:external library. Checking for ciphers is done using plain Perl code.&lt;br /&gt;
:Only collected other SSL/TLS related inofrmation requires an external&lt;br /&gt;
:library, in general libssl.&lt;br /&gt;
:The description about OpenSSL and libssl below  applys to the command&lt;br /&gt;
:&amp;lt;code&amp;gt;+cipher-openssl&amp;lt;/code&amp;gt; only.&lt;br /&gt;
:The changed commands and options will be described soon ...&lt;br /&gt;
&lt;br /&gt;
===== Version &amp;lt; 19.11.19=====&lt;br /&gt;
&lt;br /&gt;
:Up to version 19.11.19 the default behaviour for the  &amp;lt;code&amp;gt;+cipher&amp;lt;/code&amp;gt; command&lt;br /&gt;
:was to use libssl. The commands  &amp;lt;code&amp;gt;+cipherall&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+cipherraw&amp;lt;/code&amp;gt;  did not&lt;br /&gt;
:use any other library as described below.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --openssl-ciphers  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --openssl-cnf=PATH&lt;br /&gt;
:*  --openssl-s_client --s_client&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is useful  if the certificate and the configuration  must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --ciphermode=MODE======&lt;br /&gt;
&lt;br /&gt;
Following &amp;lt;code&amp;gt;MODE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
* &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt;    scan for ciphers using internal method; (default)&lt;br /&gt;
* &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt;   scan for ciphers using external openssl executable&lt;br /&gt;
* &amp;lt;code&amp;gt;ssleay&amp;lt;/code&amp;gt;    scan for ciphers using  IO::Socket  and  Net::SSLeay&lt;br /&gt;
* &amp;lt;code&amp;gt;dump&amp;lt;/code&amp;gt;      same as &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt; but print  all cipher informations,&lt;br /&gt;
:                         useful when postprocessed by contrib/* tools&lt;br /&gt;
&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; can be any string accepted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Useful if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. To start  ''o-saft.pl''  inside&lt;br /&gt;
:the Docker image, use following:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:or&lt;br /&gt;
   docker run --rm -it owasp/o-saft +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
====BUILD DOCKER IMAGE====&lt;br /&gt;
&lt;br /&gt;
:The Docker image can be installed as follows:&lt;br /&gt;
&lt;br /&gt;
   docker pull owasp/o-saft&lt;br /&gt;
&lt;br /&gt;
:The image can also easily be build from the Dockerfile (which is part&lt;br /&gt;
:of the distribution) as follows:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker build&lt;br /&gt;
&lt;br /&gt;
:To build the image from the Dockerfile with docker commands, see:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -n build&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-maps======&lt;br /&gt;
:Print internal data strucures &amp;lt;code&amp;gt;%cfg{openssl}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%cfg{ssleay}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-subs======&lt;br /&gt;
:Print formatted list of internal functions with their description.&lt;br /&gt;
:Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
====DOCUMENTATION====&lt;br /&gt;
&lt;br /&gt;
=====User Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation is mainly intented for the user, which is provided with&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
:But it may be difficult to find the proper information there.  To get&lt;br /&gt;
:more selective documentations, the  ''--help=*''  options can be used. To&lt;br /&gt;
:get an overview which  ''--help=*''  options are available, use:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:This only provides the complete user documentation, or the well known&lt;br /&gt;
:parts specified by the keyword, (HELP in example above).  To find any&lt;br /&gt;
:text with some lines of context, following could be used:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help | egrep -i -C 3 &amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:This is simply avaiable with:&lt;br /&gt;
&lt;br /&gt;
  o-saft -help=&amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:In the GUI a more sophisticate search is implemented, see the  &amp;quot;Help&amp;quot;&lt;br /&gt;
:window there:&lt;br /&gt;
&lt;br /&gt;
  o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
=====Developer Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation for developers is provided in various ways. Information&lt;br /&gt;
:for developers can be found found in:&lt;br /&gt;
&lt;br /&gt;
:* the files itself&lt;br /&gt;
&lt;br /&gt;
:* with:  &amp;lt;code&amp;gt;o-saft.pl --help=HELP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:* using:  &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 19.09.19&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256504</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256504"/>
				<updated>2019-12-29T19:15:39Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: --test-maps added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
=====Results=====&lt;br /&gt;
&lt;br /&gt;
:Results of checks are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.  This leaves the proper&lt;br /&gt;
:interpretation, if the result is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;, to the user.&lt;br /&gt;
:Background:  it is not always possible to rate a result as  &amp;quot;good&amp;quot; or&lt;br /&gt;
:&amp;quot;bad&amp;quot; or &amp;quot;insecure&amp;quot; or whatever. That's why  O-Saft  can not give the&lt;br /&gt;
:&amp;quot;the best&amp;quot; or a &amp;quot;proper&amp;quot; recomendation. In practice it depends on the&lt;br /&gt;
:context what a recomendation, or countermeasure should be. That's why&lt;br /&gt;
:all results are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  if considered &amp;quot;questionable&amp;quot;&lt;br /&gt;
:or &amp;quot;not good&amp;quot; (for example according other checks).&lt;br /&gt;
&lt;br /&gt;
:... more comming soon ...&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== Version 19.11.19 and later=====&lt;br /&gt;
&lt;br /&gt;
:Starting with version 19.11.19 the  +cipher  command does not use any&lt;br /&gt;
:external library. Checking for ciphers is done using plain Perl code.&lt;br /&gt;
:Only collected other SSL/TLS related inofrmation requires an external&lt;br /&gt;
:library, in general libssl.&lt;br /&gt;
:The description about OpenSSL and libssl below  applys to the command&lt;br /&gt;
:&amp;lt;code&amp;gt;+cipher-openssl&amp;lt;/code&amp;gt; only.&lt;br /&gt;
:The changed commands and options will be described soon ...&lt;br /&gt;
&lt;br /&gt;
===== Version &amp;lt; 19.11.19=====&lt;br /&gt;
&lt;br /&gt;
:Up to version 19.11.19 the default behaviour for the  &amp;lt;code&amp;gt;+cipher&amp;lt;/code&amp;gt; command&lt;br /&gt;
:was to use libssl. The commands  &amp;lt;code&amp;gt;+cipherall&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+cipherraw&amp;lt;/code&amp;gt;  did not&lt;br /&gt;
:use any other library as described below.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --openssl-ciphers  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --openssl-cnf=PATH&lt;br /&gt;
:*  --openssl-s_client --s_client&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is useful  if the certificate and the configuration  must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --ciphermode=MODE======&lt;br /&gt;
&lt;br /&gt;
Following &amp;lt;code&amp;gt;MODE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
* &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt;    scan for ciphers using internal method; (default)&lt;br /&gt;
* &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt;   scan for ciphers using external openssl executable&lt;br /&gt;
* &amp;lt;code&amp;gt;ssleay&amp;lt;/code&amp;gt;    scan for ciphers using  IO::Socket  and  Net::SSLeay&lt;br /&gt;
* &amp;lt;code&amp;gt;dump&amp;lt;/code&amp;gt;      same as &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt; but print  all cipher informations,&lt;br /&gt;
:                         useful when postprocessed by contrib/* tools&lt;br /&gt;
&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; can be any string accepted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Useful if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. To start  ''o-saft.pl''  inside&lt;br /&gt;
:the Docker image, use following:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:or&lt;br /&gt;
   docker run --rm -it owasp/o-saft +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
====BUILD DOCKER IMAGE====&lt;br /&gt;
&lt;br /&gt;
:The Docker image can be installed as follows:&lt;br /&gt;
&lt;br /&gt;
   docker pull owasp/o-saft&lt;br /&gt;
&lt;br /&gt;
:The image can also easily be build from the Dockerfile (which is part&lt;br /&gt;
:of the distribution) as follows:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker build&lt;br /&gt;
&lt;br /&gt;
:To build the image from the Dockerfile with docker commands, see:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -n build&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-maps======&lt;br /&gt;
:Print internal data strucures &amp;lt;code&amp;gt;%cfg{openssl}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%cfg{ssleay}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
====DOCUMENTATION====&lt;br /&gt;
&lt;br /&gt;
=====User Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation is mainly intented for the user, which is provided with&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
:But it may be difficult to find the proper information there.  To get&lt;br /&gt;
:more selective documentations, the  ''--help=*''  options can be used. To&lt;br /&gt;
:get an overview which  ''--help=*''  options are available, use:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:This only provides the complete user documentation, or the well known&lt;br /&gt;
:parts specified by the keyword, (HELP in example above).  To find any&lt;br /&gt;
:text with some lines of context, following could be used:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help | egrep -i -C 3 &amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:This is simply avaiable with:&lt;br /&gt;
&lt;br /&gt;
  o-saft -help=&amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:In the GUI a more sophisticate search is implemented, see the  &amp;quot;Help&amp;quot;&lt;br /&gt;
:window there:&lt;br /&gt;
&lt;br /&gt;
  o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
=====Developer Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation for developers is provided in various ways. Information&lt;br /&gt;
:for developers can be found found in:&lt;br /&gt;
&lt;br /&gt;
:* the files itself&lt;br /&gt;
&lt;br /&gt;
:* with:  &amp;lt;code&amp;gt;o-saft.pl --help=HELP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:* using:  &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 19.09.19&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256258</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256258"/>
				<updated>2019-12-05T22:34:18Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* --ciphermode=MODE */ markup added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
=====Results=====&lt;br /&gt;
&lt;br /&gt;
:Results of checks are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.  This leaves the proper&lt;br /&gt;
:interpretation, if the result is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;, to the user.&lt;br /&gt;
:Background:  it is not always possible to rate a result as  &amp;quot;good&amp;quot; or&lt;br /&gt;
:&amp;quot;bad&amp;quot; or &amp;quot;insecure&amp;quot; or whatever. That's why  O-Saft  can not give the&lt;br /&gt;
:&amp;quot;the best&amp;quot; or a &amp;quot;proper&amp;quot; recomendation. In practice it depends on the&lt;br /&gt;
:context what a recomendation, or countermeasure should be. That's why&lt;br /&gt;
:all results are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  if considered &amp;quot;questionable&amp;quot;&lt;br /&gt;
:or &amp;quot;not good&amp;quot; (for example according other checks).&lt;br /&gt;
&lt;br /&gt;
:... more comming soon ...&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== Version 19.11.19 and later=====&lt;br /&gt;
&lt;br /&gt;
:Starting with version 19.11.19 the  +cipher  command does not use any&lt;br /&gt;
:external library. Checking for ciphers is done using plain Perl code.&lt;br /&gt;
:Only collected other SSL/TLS related inofrmation requires an external&lt;br /&gt;
:library, in general libssl.&lt;br /&gt;
:The description about OpenSSL and libssl below  applys to the command&lt;br /&gt;
:&amp;lt;code&amp;gt;+cipher-openssl&amp;lt;/code&amp;gt; only.&lt;br /&gt;
:The changed commands and options will be described soon ...&lt;br /&gt;
&lt;br /&gt;
===== Version &amp;lt; 19.11.19=====&lt;br /&gt;
&lt;br /&gt;
:Up to version 19.11.19 the default behaviour for the  &amp;lt;code&amp;gt;+cipher&amp;lt;/code&amp;gt; command&lt;br /&gt;
:was to use libssl. The commands  &amp;lt;code&amp;gt;+cipherall&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+cipherraw&amp;lt;/code&amp;gt;  did not&lt;br /&gt;
:use any other library as described below.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --openssl-ciphers  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --openssl-cnf=PATH&lt;br /&gt;
:*  --openssl-s_client --s_client&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is useful  if the certificate and the configuration  must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --ciphermode=MODE======&lt;br /&gt;
&lt;br /&gt;
Following &amp;lt;code&amp;gt;MODE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
* &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt;    scan for ciphers using internal method; (default)&lt;br /&gt;
* &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt;   scan for ciphers using external openssl executable&lt;br /&gt;
* &amp;lt;code&amp;gt;ssleay&amp;lt;/code&amp;gt;    scan for ciphers using  IO::Socket  and  Net::SSLeay&lt;br /&gt;
* &amp;lt;code&amp;gt;dump&amp;lt;/code&amp;gt;      same as &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt; but print  all cipher informations,&lt;br /&gt;
:                         useful when postprocessed by contrib/* tools&lt;br /&gt;
&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; can be any string accepted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Useful if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. To start  ''o-saft.pl''  inside&lt;br /&gt;
:the Docker image, use following:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:or&lt;br /&gt;
   docker run --rm -it owasp/o-saft +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
====BUILD DOCKER IMAGE====&lt;br /&gt;
&lt;br /&gt;
:The Docker image can be installed as follows:&lt;br /&gt;
&lt;br /&gt;
   docker pull owasp/o-saft&lt;br /&gt;
&lt;br /&gt;
:The image can also easily be build from the Dockerfile (which is part&lt;br /&gt;
:of the distribution) as follows:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker build&lt;br /&gt;
&lt;br /&gt;
:To build the image from the Dockerfile with docker commands, see:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -n build&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
====DOCUMENTATION====&lt;br /&gt;
&lt;br /&gt;
=====User Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation is mainly intented for the user, which is provided with&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
:But it may be difficult to find the proper information there.  To get&lt;br /&gt;
:more selective documentations, the  ''--help=*''  options can be used. To&lt;br /&gt;
:get an overview which  ''--help=*''  options are available, use:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:This only provides the complete user documentation, or the well known&lt;br /&gt;
:parts specified by the keyword, (HELP in example above).  To find any&lt;br /&gt;
:text with some lines of context, following could be used:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help | egrep -i -C 3 &amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:This is simply avaiable with:&lt;br /&gt;
&lt;br /&gt;
  o-saft -help=&amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:In the GUI a more sophisticate search is implemented, see the  &amp;quot;Help&amp;quot;&lt;br /&gt;
:window there:&lt;br /&gt;
&lt;br /&gt;
  o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
=====Developer Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation for developers is provided in various ways. Information&lt;br /&gt;
:for developers can be found found in:&lt;br /&gt;
&lt;br /&gt;
:* the files itself&lt;br /&gt;
&lt;br /&gt;
:* with:  &amp;lt;code&amp;gt;o-saft.pl --help=HELP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:* using:  &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 19.09.19&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256257</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256257"/>
				<updated>2019-12-05T22:33:43Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* --ciphermode=MODE */ typo corrected&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
=====Results=====&lt;br /&gt;
&lt;br /&gt;
:Results of checks are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.  This leaves the proper&lt;br /&gt;
:interpretation, if the result is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;, to the user.&lt;br /&gt;
:Background:  it is not always possible to rate a result as  &amp;quot;good&amp;quot; or&lt;br /&gt;
:&amp;quot;bad&amp;quot; or &amp;quot;insecure&amp;quot; or whatever. That's why  O-Saft  can not give the&lt;br /&gt;
:&amp;quot;the best&amp;quot; or a &amp;quot;proper&amp;quot; recomendation. In practice it depends on the&lt;br /&gt;
:context what a recomendation, or countermeasure should be. That's why&lt;br /&gt;
:all results are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  if considered &amp;quot;questionable&amp;quot;&lt;br /&gt;
:or &amp;quot;not good&amp;quot; (for example according other checks).&lt;br /&gt;
&lt;br /&gt;
:... more comming soon ...&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== Version 19.11.19 and later=====&lt;br /&gt;
&lt;br /&gt;
:Starting with version 19.11.19 the  +cipher  command does not use any&lt;br /&gt;
:external library. Checking for ciphers is done using plain Perl code.&lt;br /&gt;
:Only collected other SSL/TLS related inofrmation requires an external&lt;br /&gt;
:library, in general libssl.&lt;br /&gt;
:The description about OpenSSL and libssl below  applys to the command&lt;br /&gt;
:&amp;lt;code&amp;gt;+cipher-openssl&amp;lt;/code&amp;gt; only.&lt;br /&gt;
:The changed commands and options will be described soon ...&lt;br /&gt;
&lt;br /&gt;
===== Version &amp;lt; 19.11.19=====&lt;br /&gt;
&lt;br /&gt;
:Up to version 19.11.19 the default behaviour for the  &amp;lt;code&amp;gt;+cipher&amp;lt;/code&amp;gt; command&lt;br /&gt;
:was to use libssl. The commands  &amp;lt;code&amp;gt;+cipherall&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+cipherraw&amp;lt;/code&amp;gt;  did not&lt;br /&gt;
:use any other library as described below.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --openssl-ciphers  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --openssl-cnf=PATH&lt;br /&gt;
:*  --openssl-s_client --s_client&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is useful  if the certificate and the configuration  must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --ciphermode=MODE======&lt;br /&gt;
&lt;br /&gt;
Following &amp;lt;code&amp;gt;MODE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
* &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt;    scan for ciphers using internal method; (default)&lt;br /&gt;
* &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt;   scan for ciphers using external openssl executable&lt;br /&gt;
* &amp;lt;code&amp;gt;ssleay&amp;lt;/code&amp;gt;    scan for ciphers using  IO::Socket  and  Net::SSLeay&lt;br /&gt;
* &amp;lt;code&amp;gt;dump&amp;lt;/code&amp;gt;      same as 'intern' but print  all cipher informations,&lt;br /&gt;
:                         useful when postprocessed by contrib/* tools&lt;br /&gt;
&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; can be any string accepted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Useful if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. To start  ''o-saft.pl''  inside&lt;br /&gt;
:the Docker image, use following:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:or&lt;br /&gt;
   docker run --rm -it owasp/o-saft +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
====BUILD DOCKER IMAGE====&lt;br /&gt;
&lt;br /&gt;
:The Docker image can be installed as follows:&lt;br /&gt;
&lt;br /&gt;
   docker pull owasp/o-saft&lt;br /&gt;
&lt;br /&gt;
:The image can also easily be build from the Dockerfile (which is part&lt;br /&gt;
:of the distribution) as follows:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker build&lt;br /&gt;
&lt;br /&gt;
:To build the image from the Dockerfile with docker commands, see:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -n build&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
====DOCUMENTATION====&lt;br /&gt;
&lt;br /&gt;
=====User Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation is mainly intented for the user, which is provided with&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
:But it may be difficult to find the proper information there.  To get&lt;br /&gt;
:more selective documentations, the  ''--help=*''  options can be used. To&lt;br /&gt;
:get an overview which  ''--help=*''  options are available, use:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:This only provides the complete user documentation, or the well known&lt;br /&gt;
:parts specified by the keyword, (HELP in example above).  To find any&lt;br /&gt;
:text with some lines of context, following could be used:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help | egrep -i -C 3 &amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:This is simply avaiable with:&lt;br /&gt;
&lt;br /&gt;
  o-saft -help=&amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:In the GUI a more sophisticate search is implemented, see the  &amp;quot;Help&amp;quot;&lt;br /&gt;
:window there:&lt;br /&gt;
&lt;br /&gt;
  o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
=====Developer Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation for developers is provided in various ways. Information&lt;br /&gt;
:for developers can be found found in:&lt;br /&gt;
&lt;br /&gt;
:* the files itself&lt;br /&gt;
&lt;br /&gt;
:* with:  &amp;lt;code&amp;gt;o-saft.pl --help=HELP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:* using:  &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 19.09.19&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256180</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256180"/>
				<updated>2019-11-25T21:41:42Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* TECHNICAL INFORMATION */ syntax corrected&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
=====Results=====&lt;br /&gt;
&lt;br /&gt;
:Results of checks are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.  This leaves the proper&lt;br /&gt;
:interpretation, if the result is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;, to the user.&lt;br /&gt;
:Background:  it is not always possible to rate a result as  &amp;quot;good&amp;quot; or&lt;br /&gt;
:&amp;quot;bad&amp;quot; or &amp;quot;insecure&amp;quot; or whatever. That's why  O-Saft  can not give the&lt;br /&gt;
:&amp;quot;the best&amp;quot; or a &amp;quot;proper&amp;quot; recomendation. In practice it depends on the&lt;br /&gt;
:context what a recomendation, or countermeasure should be. That's why&lt;br /&gt;
:all results are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  if considered &amp;quot;questionable&amp;quot;&lt;br /&gt;
:or &amp;quot;not good&amp;quot; (for example according other checks).&lt;br /&gt;
&lt;br /&gt;
:... more comming soon ...&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== Version 19.11.19 and later=====&lt;br /&gt;
&lt;br /&gt;
:Starting with version 19.11.19 the  +cipher  command does not use any&lt;br /&gt;
:external library. Checking for ciphers is done using plain Perl code.&lt;br /&gt;
:Only collected other SSL/TLS related inofrmation requires an external&lt;br /&gt;
:library, in general libssl.&lt;br /&gt;
:The description about OpenSSL and libssl below  applys to the command&lt;br /&gt;
:&amp;lt;code&amp;gt;+cipher-openssl&amp;lt;/code&amp;gt; only.&lt;br /&gt;
:The changed commands and options will be described soon ...&lt;br /&gt;
&lt;br /&gt;
===== Version &amp;lt; 19.11.19=====&lt;br /&gt;
&lt;br /&gt;
:Up to version 19.11.19 the default behaviour for the  &amp;lt;code&amp;gt;+cipher&amp;lt;/code&amp;gt; command&lt;br /&gt;
:was to use libssl. The commands  &amp;lt;code&amp;gt;+cipherall&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+cipherraw&amp;lt;/code&amp;gt;  did not&lt;br /&gt;
:use any other library as described below.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --openssl-ciphers  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --openssl-cnf=PATH&lt;br /&gt;
:*  --openssl-s_client --s_client&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is useful  if the certificate and the configuration  must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --ciphermode=MODE======&lt;br /&gt;
&lt;br /&gt;
Following &amp;lt;code&amp;gt;MODE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
* &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt;    scan for ciphers using internal method; (default)&lt;br /&gt;
* &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt;   scan for ciphers using external openssl executable&lt;br /&gt;
* &amp;lt;code&amp;gt;ssleay&amp;lt;/code&amp;gt;    scan for ciphers using  IO::Socket  and  Net::SSLeay&lt;br /&gt;
* &amp;lt;code&amp;gt;dump&amp;lt;/code&amp;gt;      same as 'intern' but print  all cipher informations,&lt;br /&gt;
&amp;gt;                         useful when postprocessed by contrib/* tools&lt;br /&gt;
&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; can be any string accepted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Useful if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. To start  ''o-saft.pl''  inside&lt;br /&gt;
:the Docker image, use following:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:or&lt;br /&gt;
   docker run --rm -it owasp/o-saft +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
====BUILD DOCKER IMAGE====&lt;br /&gt;
&lt;br /&gt;
:The Docker image can be installed as follows:&lt;br /&gt;
&lt;br /&gt;
   docker pull owasp/o-saft&lt;br /&gt;
&lt;br /&gt;
:The image can also easily be build from the Dockerfile (which is part&lt;br /&gt;
:of the distribution) as follows:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker build&lt;br /&gt;
&lt;br /&gt;
:To build the image from the Dockerfile with docker commands, see:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -n build&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
====DOCUMENTATION====&lt;br /&gt;
&lt;br /&gt;
=====User Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation is mainly intented for the user, which is provided with&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
:But it may be difficult to find the proper information there.  To get&lt;br /&gt;
:more selective documentations, the  ''--help=*''  options can be used. To&lt;br /&gt;
:get an overview which  ''--help=*''  options are available, use:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:This only provides the complete user documentation, or the well known&lt;br /&gt;
:parts specified by the keyword, (HELP in example above).  To find any&lt;br /&gt;
:text with some lines of context, following could be used:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help | egrep -i -C 3 &amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:This is simply avaiable with:&lt;br /&gt;
&lt;br /&gt;
  o-saft -help=&amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:In the GUI a more sophisticate search is implemented, see the  &amp;quot;Help&amp;quot;&lt;br /&gt;
:window there:&lt;br /&gt;
&lt;br /&gt;
  o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
=====Developer Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation for developers is provided in various ways. Information&lt;br /&gt;
:for developers can be found found in:&lt;br /&gt;
&lt;br /&gt;
:* the files itself&lt;br /&gt;
&lt;br /&gt;
:* with:  &amp;lt;code&amp;gt;o-saft.pl --help=HELP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:* using:  &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 19.09.19&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256179</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256179"/>
				<updated>2019-11-25T21:41:02Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* TECHNICAL INFORMATION */ Version 19.11.19 added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
=====Results=====&lt;br /&gt;
&lt;br /&gt;
:Results of checks are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.  This leaves the proper&lt;br /&gt;
:interpretation, if the result is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;, to the user.&lt;br /&gt;
:Background:  it is not always possible to rate a result as  &amp;quot;good&amp;quot; or&lt;br /&gt;
:&amp;quot;bad&amp;quot; or &amp;quot;insecure&amp;quot; or whatever. That's why  O-Saft  can not give the&lt;br /&gt;
:&amp;quot;the best&amp;quot; or a &amp;quot;proper&amp;quot; recomendation. In practice it depends on the&lt;br /&gt;
:context what a recomendation, or countermeasure should be. That's why&lt;br /&gt;
:all results are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  if considered &amp;quot;questionable&amp;quot;&lt;br /&gt;
:or &amp;quot;not good&amp;quot; (for example according other checks).&lt;br /&gt;
&lt;br /&gt;
:... more comming soon ...&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== Version 19.11.19 and later&lt;br /&gt;
&lt;br /&gt;
:Starting with version 19.11.19 the  +cipher  command does not use any&lt;br /&gt;
:external library. Checking for ciphers is done using plain Perl code.&lt;br /&gt;
:Only collected other SSL/TLS related inofrmation requires an external&lt;br /&gt;
:library, in general libssl.&lt;br /&gt;
:The description about OpenSSL and libssl below  applys to the command&lt;br /&gt;
:&amp;lt;code&amp;gt;+cipher-openssl&amp;lt;/code&amp;gt; only.&lt;br /&gt;
:The changed commands and options will be described soon ...&lt;br /&gt;
&lt;br /&gt;
===== Version &amp;lt; 19.11.19&lt;br /&gt;
&lt;br /&gt;
:Up to version 19.11.19 the default behaviour for the  &amp;lt;code&amp;gt;+cipher&amp;lt;/code&amp;gt; command&lt;br /&gt;
:was to use libssl. The commands  &amp;lt;code&amp;gt;+cipherall&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+cipherraw&amp;lt;/code&amp;gt;  did not&lt;br /&gt;
:use any other library as described below.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --openssl-ciphers  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --openssl-cnf=PATH&lt;br /&gt;
:*  --openssl-s_client --s_client&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is useful  if the certificate and the configuration  must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --ciphermode=MODE======&lt;br /&gt;
&lt;br /&gt;
Following &amp;lt;code&amp;gt;MODE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
* &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt;    scan for ciphers using internal method; (default)&lt;br /&gt;
* &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt;   scan for ciphers using external openssl executable&lt;br /&gt;
* &amp;lt;code&amp;gt;ssleay&amp;lt;/code&amp;gt;    scan for ciphers using  IO::Socket  and  Net::SSLeay&lt;br /&gt;
* &amp;lt;code&amp;gt;dump&amp;lt;/code&amp;gt;      same as 'intern' but print  all cipher informations,&lt;br /&gt;
&amp;gt;                         useful when postprocessed by contrib/* tools&lt;br /&gt;
&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; can be any string accepted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Useful if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. To start  ''o-saft.pl''  inside&lt;br /&gt;
:the Docker image, use following:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:or&lt;br /&gt;
   docker run --rm -it owasp/o-saft +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
====BUILD DOCKER IMAGE====&lt;br /&gt;
&lt;br /&gt;
:The Docker image can be installed as follows:&lt;br /&gt;
&lt;br /&gt;
   docker pull owasp/o-saft&lt;br /&gt;
&lt;br /&gt;
:The image can also easily be build from the Dockerfile (which is part&lt;br /&gt;
:of the distribution) as follows:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker build&lt;br /&gt;
&lt;br /&gt;
:To build the image from the Dockerfile with docker commands, see:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -n build&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
====DOCUMENTATION====&lt;br /&gt;
&lt;br /&gt;
=====User Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation is mainly intented for the user, which is provided with&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
:But it may be difficult to find the proper information there.  To get&lt;br /&gt;
:more selective documentations, the  ''--help=*''  options can be used. To&lt;br /&gt;
:get an overview which  ''--help=*''  options are available, use:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:This only provides the complete user documentation, or the well known&lt;br /&gt;
:parts specified by the keyword, (HELP in example above).  To find any&lt;br /&gt;
:text with some lines of context, following could be used:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help | egrep -i -C 3 &amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:This is simply avaiable with:&lt;br /&gt;
&lt;br /&gt;
  o-saft -help=&amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:In the GUI a more sophisticate search is implemented, see the  &amp;quot;Help&amp;quot;&lt;br /&gt;
:window there:&lt;br /&gt;
&lt;br /&gt;
  o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
=====Developer Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation for developers is provided in various ways. Information&lt;br /&gt;
:for developers can be found found in:&lt;br /&gt;
&lt;br /&gt;
:* the files itself&lt;br /&gt;
&lt;br /&gt;
:* with:  &amp;lt;code&amp;gt;o-saft.pl --help=HELP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:* using:  &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 19.09.19&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256178</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256178"/>
				<updated>2019-11-25T21:35:21Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* OpenSSL, libssl, libcrypto */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
=====Results=====&lt;br /&gt;
&lt;br /&gt;
:Results of checks are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.  This leaves the proper&lt;br /&gt;
:interpretation, if the result is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;, to the user.&lt;br /&gt;
:Background:  it is not always possible to rate a result as  &amp;quot;good&amp;quot; or&lt;br /&gt;
:&amp;quot;bad&amp;quot; or &amp;quot;insecure&amp;quot; or whatever. That's why  O-Saft  can not give the&lt;br /&gt;
:&amp;quot;the best&amp;quot; or a &amp;quot;proper&amp;quot; recomendation. In practice it depends on the&lt;br /&gt;
:context what a recomendation, or countermeasure should be. That's why&lt;br /&gt;
:all results are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  if considered &amp;quot;questionable&amp;quot;&lt;br /&gt;
:or &amp;quot;not good&amp;quot; (for example according other checks).&lt;br /&gt;
&lt;br /&gt;
:... more comming soon ...&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --openssl-ciphers  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --openssl-cnf=PATH&lt;br /&gt;
:*  --openssl-s_client --s_client&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is useful  if the certificate and the configuration  must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --ciphermode=MODE======&lt;br /&gt;
&lt;br /&gt;
Following &amp;lt;code&amp;gt;MODE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
* &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt;    scan for ciphers using internal method; (default)&lt;br /&gt;
* &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt;   scan for ciphers using external openssl executable&lt;br /&gt;
* &amp;lt;code&amp;gt;ssleay&amp;lt;/code&amp;gt;    scan for ciphers using  IO::Socket  and  Net::SSLeay&lt;br /&gt;
* &amp;lt;code&amp;gt;dump&amp;lt;/code&amp;gt;      same as 'intern' but print  all cipher informations,&lt;br /&gt;
&amp;gt;                         useful when postprocessed by contrib/* tools&lt;br /&gt;
&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; can be any string accepted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Useful if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. To start  ''o-saft.pl''  inside&lt;br /&gt;
:the Docker image, use following:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:or&lt;br /&gt;
   docker run --rm -it owasp/o-saft +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
====BUILD DOCKER IMAGE====&lt;br /&gt;
&lt;br /&gt;
:The Docker image can be installed as follows:&lt;br /&gt;
&lt;br /&gt;
   docker pull owasp/o-saft&lt;br /&gt;
&lt;br /&gt;
:The image can also easily be build from the Dockerfile (which is part&lt;br /&gt;
:of the distribution) as follows:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker build&lt;br /&gt;
&lt;br /&gt;
:To build the image from the Dockerfile with docker commands, see:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -n build&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
====DOCUMENTATION====&lt;br /&gt;
&lt;br /&gt;
=====User Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation is mainly intented for the user, which is provided with&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
:But it may be difficult to find the proper information there.  To get&lt;br /&gt;
:more selective documentations, the  ''--help=*''  options can be used. To&lt;br /&gt;
:get an overview which  ''--help=*''  options are available, use:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:This only provides the complete user documentation, or the well known&lt;br /&gt;
:parts specified by the keyword, (HELP in example above).  To find any&lt;br /&gt;
:text with some lines of context, following could be used:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help | egrep -i -C 3 &amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:This is simply avaiable with:&lt;br /&gt;
&lt;br /&gt;
  o-saft -help=&amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:In the GUI a more sophisticate search is implemented, see the  &amp;quot;Help&amp;quot;&lt;br /&gt;
:window there:&lt;br /&gt;
&lt;br /&gt;
  o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
=====Developer Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation for developers is provided in various ways. Information&lt;br /&gt;
:for developers can be found found in:&lt;br /&gt;
&lt;br /&gt;
:* the files itself&lt;br /&gt;
&lt;br /&gt;
:* with:  &amp;lt;code&amp;gt;o-saft.pl --help=HELP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:* using:  &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 19.09.19&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256162</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256162"/>
				<updated>2019-11-24T09:29:07Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* +hostname vs. +wildhost vs. +altname vs. +rfc_2818 */ typo corrected&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
=====Results=====&lt;br /&gt;
&lt;br /&gt;
:Results of checks are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.  This leaves the proper&lt;br /&gt;
:interpretation, if the result is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;, to the user.&lt;br /&gt;
:Background:  it is not always possible to rate a result as  &amp;quot;good&amp;quot; or&lt;br /&gt;
:&amp;quot;bad&amp;quot; or &amp;quot;insecure&amp;quot; or whatever. That's why  O-Saft  can not give the&lt;br /&gt;
:&amp;quot;the best&amp;quot; or a &amp;quot;proper&amp;quot; recomendation. In practice it depends on the&lt;br /&gt;
:context what a recomendation, or countermeasure should be. That's why&lt;br /&gt;
:all results are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  if considered &amp;quot;questionable&amp;quot;&lt;br /&gt;
:or &amp;quot;not good&amp;quot; (for example according other checks).&lt;br /&gt;
&lt;br /&gt;
:... more comming soon ...&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
&lt;br /&gt;
:Above applies to all commands except ''+cipherall'' and ''+cipherraw'' which  &lt;br /&gt;
:uses no other libraries.&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is useful  if the certificate and the configuration  must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --ciphermode=MODE======&lt;br /&gt;
&lt;br /&gt;
Following &amp;lt;code&amp;gt;MODE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
* &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt;    scan for ciphers using internal method; (default)&lt;br /&gt;
* &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt;   scan for ciphers using external openssl executable&lt;br /&gt;
* &amp;lt;code&amp;gt;ssleay&amp;lt;/code&amp;gt;    scan for ciphers using  IO::Socket  and  Net::SSLeay&lt;br /&gt;
* &amp;lt;code&amp;gt;dump&amp;lt;/code&amp;gt;      same as 'intern' but print  all cipher informations,&lt;br /&gt;
&amp;gt;                         useful when postprocessed by contrib/* tools&lt;br /&gt;
&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; can be any string accepted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Useful if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. To start  ''o-saft.pl''  inside&lt;br /&gt;
:the Docker image, use following:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:or&lt;br /&gt;
   docker run --rm -it owasp/o-saft +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
====BUILD DOCKER IMAGE====&lt;br /&gt;
&lt;br /&gt;
:The Docker image can be installed as follows:&lt;br /&gt;
&lt;br /&gt;
   docker pull owasp/o-saft&lt;br /&gt;
&lt;br /&gt;
:The image can also easily be build from the Dockerfile (which is part&lt;br /&gt;
:of the distribution) as follows:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker build&lt;br /&gt;
&lt;br /&gt;
:To build the image from the Dockerfile with docker commands, see:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -n build&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
====DOCUMENTATION====&lt;br /&gt;
&lt;br /&gt;
=====User Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation is mainly intented for the user, which is provided with&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
:But it may be difficult to find the proper information there.  To get&lt;br /&gt;
:more selective documentations, the  ''--help=*''  options can be used. To&lt;br /&gt;
:get an overview which  ''--help=*''  options are available, use:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:This only provides the complete user documentation, or the well known&lt;br /&gt;
:parts specified by the keyword, (HELP in example above).  To find any&lt;br /&gt;
:text with some lines of context, following could be used:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help | egrep -i -C 3 &amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:This is simply avaiable with:&lt;br /&gt;
&lt;br /&gt;
  o-saft -help=&amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:In the GUI a more sophisticate search is implemented, see the  &amp;quot;Help&amp;quot;&lt;br /&gt;
:window there:&lt;br /&gt;
&lt;br /&gt;
  o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
=====Developer Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation for developers is provided in various ways. Information&lt;br /&gt;
:for developers can be found found in:&lt;br /&gt;
&lt;br /&gt;
:* the files itself&lt;br /&gt;
&lt;br /&gt;
:* with:  &amp;lt;code&amp;gt;o-saft.pl --help=HELP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:* using:  &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 19.09.19&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256161</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256161"/>
				<updated>2019-11-24T09:28:46Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* --no-header */ typo corrected&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
=====Results=====&lt;br /&gt;
&lt;br /&gt;
:Results of checks are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.  This leaves the proper&lt;br /&gt;
:interpretation, if the result is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;, to the user.&lt;br /&gt;
:Background:  it is not always possible to rate a result as  &amp;quot;good&amp;quot; or&lt;br /&gt;
:&amp;quot;bad&amp;quot; or &amp;quot;insecure&amp;quot; or whatever. That's why  O-Saft  can not give the&lt;br /&gt;
:&amp;quot;the best&amp;quot; or a &amp;quot;proper&amp;quot; recomendation. In practice it depends on the&lt;br /&gt;
:context what a recomendation, or countermeasure should be. That's why&lt;br /&gt;
:all results are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  if considered &amp;quot;questionable&amp;quot;&lt;br /&gt;
:or &amp;quot;not good&amp;quot; (for example according other checks).&lt;br /&gt;
&lt;br /&gt;
:... more comming soon ...&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
&lt;br /&gt;
:Above applies to all commands except ''+cipherall'' and ''+cipherraw'' which  &lt;br /&gt;
:uses no other libraries.&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is usefull  if the certificate and the configuration must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --ciphermode=MODE======&lt;br /&gt;
&lt;br /&gt;
Following &amp;lt;code&amp;gt;MODE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
* &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt;    scan for ciphers using internal method; (default)&lt;br /&gt;
* &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt;   scan for ciphers using external openssl executable&lt;br /&gt;
* &amp;lt;code&amp;gt;ssleay&amp;lt;/code&amp;gt;    scan for ciphers using  IO::Socket  and  Net::SSLeay&lt;br /&gt;
* &amp;lt;code&amp;gt;dump&amp;lt;/code&amp;gt;      same as 'intern' but print  all cipher informations,&lt;br /&gt;
&amp;gt;                         useful when postprocessed by contrib/* tools&lt;br /&gt;
&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; can be any string accepted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Useful if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. To start  ''o-saft.pl''  inside&lt;br /&gt;
:the Docker image, use following:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:or&lt;br /&gt;
   docker run --rm -it owasp/o-saft +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
====BUILD DOCKER IMAGE====&lt;br /&gt;
&lt;br /&gt;
:The Docker image can be installed as follows:&lt;br /&gt;
&lt;br /&gt;
   docker pull owasp/o-saft&lt;br /&gt;
&lt;br /&gt;
:The image can also easily be build from the Dockerfile (which is part&lt;br /&gt;
:of the distribution) as follows:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker build&lt;br /&gt;
&lt;br /&gt;
:To build the image from the Dockerfile with docker commands, see:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -n build&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
====DOCUMENTATION====&lt;br /&gt;
&lt;br /&gt;
=====User Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation is mainly intented for the user, which is provided with&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
:But it may be difficult to find the proper information there.  To get&lt;br /&gt;
:more selective documentations, the  ''--help=*''  options can be used. To&lt;br /&gt;
:get an overview which  ''--help=*''  options are available, use:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:This only provides the complete user documentation, or the well known&lt;br /&gt;
:parts specified by the keyword, (HELP in example above).  To find any&lt;br /&gt;
:text with some lines of context, following could be used:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help | egrep -i -C 3 &amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:This is simply avaiable with:&lt;br /&gt;
&lt;br /&gt;
  o-saft -help=&amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:In the GUI a more sophisticate search is implemented, see the  &amp;quot;Help&amp;quot;&lt;br /&gt;
:window there:&lt;br /&gt;
&lt;br /&gt;
  o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
=====Developer Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation for developers is provided in various ways. Information&lt;br /&gt;
:for developers can be found found in:&lt;br /&gt;
&lt;br /&gt;
:* the files itself&lt;br /&gt;
&lt;br /&gt;
:* with:  &amp;lt;code&amp;gt;o-saft.pl --help=HELP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:* using:  &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 19.09.19&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256160</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256160"/>
				<updated>2019-11-24T09:28:23Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* --ciphermode=MODE */  syntax corrected&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
=====Results=====&lt;br /&gt;
&lt;br /&gt;
:Results of checks are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.  This leaves the proper&lt;br /&gt;
:interpretation, if the result is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;, to the user.&lt;br /&gt;
:Background:  it is not always possible to rate a result as  &amp;quot;good&amp;quot; or&lt;br /&gt;
:&amp;quot;bad&amp;quot; or &amp;quot;insecure&amp;quot; or whatever. That's why  O-Saft  can not give the&lt;br /&gt;
:&amp;quot;the best&amp;quot; or a &amp;quot;proper&amp;quot; recomendation. In practice it depends on the&lt;br /&gt;
:context what a recomendation, or countermeasure should be. That's why&lt;br /&gt;
:all results are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  if considered &amp;quot;questionable&amp;quot;&lt;br /&gt;
:or &amp;quot;not good&amp;quot; (for example according other checks).&lt;br /&gt;
&lt;br /&gt;
:... more comming soon ...&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
&lt;br /&gt;
:Above applies to all commands except ''+cipherall'' and ''+cipherraw'' which  &lt;br /&gt;
:uses no other libraries.&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is usefull  if the certificate and the configuration must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --ciphermode=MODE======&lt;br /&gt;
&lt;br /&gt;
Following &amp;lt;code&amp;gt;MODE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
* &amp;lt;code&amp;gt;intern&amp;lt;/code&amp;gt;    scan for ciphers using internal method; (default)&lt;br /&gt;
* &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt;   scan for ciphers using external openssl executable&lt;br /&gt;
* &amp;lt;code&amp;gt;ssleay&amp;lt;/code&amp;gt;    scan for ciphers using  IO::Socket  and  Net::SSLeay&lt;br /&gt;
* &amp;lt;code&amp;gt;dump&amp;lt;/code&amp;gt;      same as 'intern' but print  all cipher informations,&lt;br /&gt;
&amp;gt;                         useful when postprocessed by contrib/* tools&lt;br /&gt;
&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; can be any string accepted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Usefull if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. To start  ''o-saft.pl''  inside&lt;br /&gt;
:the Docker image, use following:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:or&lt;br /&gt;
   docker run --rm -it owasp/o-saft +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
====BUILD DOCKER IMAGE====&lt;br /&gt;
&lt;br /&gt;
:The Docker image can be installed as follows:&lt;br /&gt;
&lt;br /&gt;
   docker pull owasp/o-saft&lt;br /&gt;
&lt;br /&gt;
:The image can also easily be build from the Dockerfile (which is part&lt;br /&gt;
:of the distribution) as follows:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker build&lt;br /&gt;
&lt;br /&gt;
:To build the image from the Dockerfile with docker commands, see:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -n build&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
====DOCUMENTATION====&lt;br /&gt;
&lt;br /&gt;
=====User Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation is mainly intented for the user, which is provided with&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
:But it may be difficult to find the proper information there.  To get&lt;br /&gt;
:more selective documentations, the  ''--help=*''  options can be used. To&lt;br /&gt;
:get an overview which  ''--help=*''  options are available, use:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:This only provides the complete user documentation, or the well known&lt;br /&gt;
:parts specified by the keyword, (HELP in example above).  To find any&lt;br /&gt;
:text with some lines of context, following could be used:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help | egrep -i -C 3 &amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:This is simply avaiable with:&lt;br /&gt;
&lt;br /&gt;
  o-saft -help=&amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:In the GUI a more sophisticate search is implemented, see the  &amp;quot;Help&amp;quot;&lt;br /&gt;
:window there:&lt;br /&gt;
&lt;br /&gt;
  o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
=====Developer Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation for developers is provided in various ways. Information&lt;br /&gt;
:for developers can be found found in:&lt;br /&gt;
&lt;br /&gt;
:* the files itself&lt;br /&gt;
&lt;br /&gt;
:* with:  &amp;lt;code&amp;gt;o-saft.pl --help=HELP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:* using:  &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 19.09.19&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256159</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=256159"/>
				<updated>2019-11-24T09:25:20Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: --ciphermode=MODE added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
=====Results=====&lt;br /&gt;
&lt;br /&gt;
:Results of checks are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.  This leaves the proper&lt;br /&gt;
:interpretation, if the result is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;, to the user.&lt;br /&gt;
:Background:  it is not always possible to rate a result as  &amp;quot;good&amp;quot; or&lt;br /&gt;
:&amp;quot;bad&amp;quot; or &amp;quot;insecure&amp;quot; or whatever. That's why  O-Saft  can not give the&lt;br /&gt;
:&amp;quot;the best&amp;quot; or a &amp;quot;proper&amp;quot; recomendation. In practice it depends on the&lt;br /&gt;
:context what a recomendation, or countermeasure should be. That's why&lt;br /&gt;
:all results are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  if considered &amp;quot;questionable&amp;quot;&lt;br /&gt;
:or &amp;quot;not good&amp;quot; (for example according other checks).&lt;br /&gt;
&lt;br /&gt;
:... more comming soon ...&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
&lt;br /&gt;
:Above applies to all commands except ''+cipherall'' and ''+cipherraw'' which  &lt;br /&gt;
:uses no other libraries.&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is usefull  if the certificate and the configuration must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --ciphermode=MODE======&lt;br /&gt;
&lt;br /&gt;
Following &amp;lt;code&amp;gt;MODE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
* &amp;lt;code&amp;gt;intern'    scan for ciphers using internal method; (default)&lt;br /&gt;
* &amp;lt;code&amp;gt;openssl'   scan for ciphers using external openssl executable&lt;br /&gt;
* &amp;lt;code&amp;gt;ssleay'    scan for ciphers using  IO::Socket  and  Net::SSLeay&lt;br /&gt;
* &amp;lt;code&amp;gt;dump'      same as 'intern' but print  all cipher informations,&lt;br /&gt;
&amp;gt;                         useful when postprocessed by contrib/* tools&lt;br /&gt;
&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; can be any string accepted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Usefull if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. To start  ''o-saft.pl''  inside&lt;br /&gt;
:the Docker image, use following:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:or&lt;br /&gt;
   docker run --rm -it owasp/o-saft +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
====BUILD DOCKER IMAGE====&lt;br /&gt;
&lt;br /&gt;
:The Docker image can be installed as follows:&lt;br /&gt;
&lt;br /&gt;
   docker pull owasp/o-saft&lt;br /&gt;
&lt;br /&gt;
:The image can also easily be build from the Dockerfile (which is part&lt;br /&gt;
:of the distribution) as follows:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker build&lt;br /&gt;
&lt;br /&gt;
:To build the image from the Dockerfile with docker commands, see:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -n build&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
====DOCUMENTATION====&lt;br /&gt;
&lt;br /&gt;
=====User Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation is mainly intented for the user, which is provided with&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
:But it may be difficult to find the proper information there.  To get&lt;br /&gt;
:more selective documentations, the  ''--help=*''  options can be used. To&lt;br /&gt;
:get an overview which  ''--help=*''  options are available, use:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:This only provides the complete user documentation, or the well known&lt;br /&gt;
:parts specified by the keyword, (HELP in example above).  To find any&lt;br /&gt;
:text with some lines of context, following could be used:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help | egrep -i -C 3 &amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:This is simply avaiable with:&lt;br /&gt;
&lt;br /&gt;
  o-saft -help=&amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:In the GUI a more sophisticate search is implemented, see the  &amp;quot;Help&amp;quot;&lt;br /&gt;
:window there:&lt;br /&gt;
&lt;br /&gt;
  o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
=====Developer Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation for developers is provided in various ways. Information&lt;br /&gt;
:for developers can be found found in:&lt;br /&gt;
&lt;br /&gt;
:* the files itself&lt;br /&gt;
&lt;br /&gt;
:* with:  &amp;lt;code&amp;gt;o-saft.pl --help=HELP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:* using:  &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 19.09.19&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Static_Code_Analysis&amp;diff=255500</id>
		<title>Static Code Analysis</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Static_Code_Analysis&amp;diff=255500"/>
				<updated>2019-10-16T10:29:52Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* Commercial */ xanatizer added, see https://www.owasp.org/index.php/SAST&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Every '''[[control]]''' should follow this template.&lt;br /&gt;
&lt;br /&gt;
{{Template:Control}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Category:OWASP ASDR Project]]&lt;br /&gt;
&lt;br /&gt;
Last revision (mm/dd/yy): '''{{REVISIONMONTH}}/{{REVISIONDAY}}/{{REVISIONYEAR}}'''&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Static Code Analysis (also known as Source Code Analysis) is usually performed as part of a Code Review (also known as white-box testing) and is carried out at the Implementation phase of a Security Development Lifecycle (SDL). Static Code Analysis commonly refers to the running of Static Code Analysis tools that attempt to highlight possible vulnerabilities within 'static' (non-running) source code by using techniques such as Taint Analysis and Data Flow Analysis.&lt;br /&gt;
&lt;br /&gt;
Ideally, such tools would automatically find security flaws with a high degree of confidence that what is found is indeed a flaw. However, this is beyond the state of the art for many types of application security flaws. Thus, such tools frequently serve as aids for an analyst to help them zero in on security relevant portions of code so they can find flaws more efficiently, rather than a tool that simply finds flaws automatically.&lt;br /&gt;
&lt;br /&gt;
Some tools are starting to move into the Integrated Development Environment (IDE). For the types of problems that can be detected during the software development phase itself, this is a powerful phase within the development lifecycle to employ such tools, as it provides immediate feedback to the developer on issues they might be introducing into the code during code development itself. This immediate feedback is very useful as compared to finding vulnerabilities much later in the development cycle.&lt;br /&gt;
&lt;br /&gt;
The UK Defense Standard 00-55 requires that Static Code Analysis be used on all 'safety related software in defense equipment'.&amp;lt;sup&amp;gt;[0]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Techniques==&lt;br /&gt;
There are various techniques to analyze static source code for potential vulnerabilities that maybe combined into one solution. These techniques are often derived from compiler technologies.&lt;br /&gt;
&lt;br /&gt;
===Data Flow Analysis===&lt;br /&gt;
Data flow analysis is used to collect run-time (dynamic) information about data in software while it is in a static state (Wögerer, 2005).&lt;br /&gt;
&lt;br /&gt;
There are three common terms used in data flow analysis, basic block (the code), Control Flow Analysis (the flow of data) and Control Flow Path (the path the data takes):&lt;br /&gt;
&lt;br /&gt;
Basic block: A sequence of consecutive instructions where control enters at the beginning of a block, control leaves at the end of a block and the block cannot halt or branch out except at its end (Wögerer, 2005).&lt;br /&gt;
&lt;br /&gt;
Example PHP basic block:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1. $a = 0;&lt;br /&gt;
2. $b = 1;&lt;br /&gt;
3. &lt;br /&gt;
4. if ($a == $b) &lt;br /&gt;
5. { # start of block&lt;br /&gt;
6.   echo “a and b are the same”;&lt;br /&gt;
7. } # end of block &lt;br /&gt;
8. else &lt;br /&gt;
9. { # start of block &lt;br /&gt;
10. echo “a and b are different”;&lt;br /&gt;
11.} # end of block&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Control Flow Graph (CFG) ===&lt;br /&gt;
An abstract graph representation of software by use of nodes that represent basic blocks. A node in a graph represents a block; directed edges are used to represent jumps (paths) from one block to another. If a node only has an exit edge, this is known as an ‘entry’ block, if a node only has a entry edge, this is know as an ‘exit’ block (Wögerer, 2005).&lt;br /&gt;
&lt;br /&gt;
Example Control Flow Graph; ‘node 1’ represents the entry block and ‘node 6’ represents the exit block.&lt;br /&gt;
&lt;br /&gt;
￼[[File:Control_flow_graph.png|400x200px]]&lt;br /&gt;
&lt;br /&gt;
===Taint Analysis===&lt;br /&gt;
Taint Analysis attempts to identify variables that have been 'tainted' with user controllable input and traces them to possible vulnerable functions also known as a 'sink'. If the tainted variable gets passed to a sink without first being sanitized it is flagged as a vulnerability.&lt;br /&gt;
&lt;br /&gt;
Some programming languages such as Perl and Ruby have Taint Checking built into them and enabled in certain situations such as accepting data via CGI.&lt;br /&gt;
&lt;br /&gt;
===Lexical Analysis===&lt;br /&gt;
Lexical Analysis converts source code syntax into ‘tokens’ of information in an attempt to abstract the source code and make it easier to manipulate (Sotirov, 2005).&lt;br /&gt;
&lt;br /&gt;
Pre tokenised PHP source code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;amp;lt;?php $name = &amp;quot;Ryan&amp;quot;; ?&amp;amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Post tokenised PHP source code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
T_OPEN_TAG&lt;br /&gt;
T_VARIABLE&lt;br /&gt;
=&lt;br /&gt;
T_CONSTANT_ENCAPSED_STRING&lt;br /&gt;
;&lt;br /&gt;
T_CLOSE_TAG&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Strengths and Weaknesses==&lt;br /&gt;
&lt;br /&gt;
=== Strengths ===&lt;br /&gt;
* Scales Well (Can be run on lots of software, and can be repeatedly (like in nightly builds))&lt;br /&gt;
* For things that such tools can automatically find with high confidence, such as buffer overflows, SQL Injection Flaws, etc. they are great.&lt;br /&gt;
&lt;br /&gt;
=== Weaknesses ===&lt;br /&gt;
* Many types of security vulnerabilities are very difficult to find automatically, such as authentication problems, access control issues, insecure use of cryptography, etc. The current state of the art only allows such tools to automatically find a relatively small percentage of application security flaws. Tools of this type are getting better, however.&lt;br /&gt;
* High numbers of false positives.&lt;br /&gt;
* Frequently can't find configuration issues, since they are not represented in the code.&lt;br /&gt;
* Difficult to 'prove' that an identified security issue is an actual vulnerability.&lt;br /&gt;
* Many of these tools have difficulty analyzing code that can't be compiled. Analysts frequently can't compile code because they don't have the right libraries, all the compilation instructions, all the code, etc.&lt;br /&gt;
&lt;br /&gt;
==Limitations==&lt;br /&gt;
&lt;br /&gt;
===False Positives===&lt;br /&gt;
A static code analysis tool will often produce false positive results where the tool reports a possible vulnerability that in fact is not. This often occurs because the tool cannot be sure of the integrity and security of data as it flows through the application from input to output.&lt;br /&gt;
&lt;br /&gt;
False positive results might be reported when analysing an application that interacts with closed source components or external systems because without the source code it is impossible to trace the flow of data in the external system and hence ensure the integrity and security of the data.&lt;br /&gt;
&lt;br /&gt;
===False Negatives===&lt;br /&gt;
The use of static code analysis tools can also result in false negative results where vulnerabilities result but the tool does not report them. This might occur if a new vulnerability is discovered in an external component or if the analysis tool has no knowledge of the runtime environment and whether it is configured securely.&lt;br /&gt;
&lt;br /&gt;
==Important Selection Criteria==&lt;br /&gt;
&lt;br /&gt;
* Requirement: Must support your language, but not usually a key factor once it does.&lt;br /&gt;
* Types of Vulnerabilities it can detect (The OWASP Top Ten?) (more?)&lt;br /&gt;
* Does it require a fully buildable set of source?&lt;br /&gt;
* Can it run against binaries instead of source?&lt;br /&gt;
* Can it be integrated into the developer's IDE?&lt;br /&gt;
* License cost for the tool. (Some are sold per user, per org, per app, per line of code analyzed. Consulting licenses are frequently different than end user licenses.)&lt;br /&gt;
* Does it support Object-oriented programming (OOP)?&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
&lt;br /&gt;
===RIPS PHP Static Code Analysis Tool===&lt;br /&gt;
[[File:Rips.jpg|400px|thum|]]&lt;br /&gt;
&lt;br /&gt;
===OWASP LAPSE+ Static Code Analysis Tool===&lt;br /&gt;
[[File:LapsePlusScreenshot.png|400px|thum|]]&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
===OWASP Tools===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Software&lt;br /&gt;
! Language(s)&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:OWASP_Code_Crawler|OWASP Code Crawler]]&lt;br /&gt;
| .NET, Java&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:OWASP_Orizon_Project|OWASP Orizon Project]]&lt;br /&gt;
| Java&lt;br /&gt;
|-&lt;br /&gt;
| [[OWASP LAPSE Project]]&lt;br /&gt;
| Java&lt;br /&gt;
|-&lt;br /&gt;
| [[OWASP O2 Platform]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [[OWASP WAP-Web Application Protection]]&lt;br /&gt;
| PHP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Open Source/Free ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Software&lt;br /&gt;
! Language(s)&lt;br /&gt;
! OS(es)&lt;br /&gt;
|-&lt;br /&gt;
| [https://sourceforge.net/projects/agnitiotool/ Agnitio]&lt;br /&gt;
| ASP, ASP.NET, C#, Java, Javascript, Perl, PHP, Python, Ruby, VB.NET, XML&lt;br /&gt;
| Windows&lt;br /&gt;
|-&lt;br /&gt;
| [https://brakemanscanner.org/ Brakeman]&lt;br /&gt;
| Ruby, Rails&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [https://www.bishopfox.com/resources/tools/google-hacking-diggity/attack-tools/ Google CodeSearchDiggity]&lt;br /&gt;
| Multiple&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://www.devbug.co.uk DevBug]&lt;br /&gt;
| PHP&lt;br /&gt;
| web-based&lt;br /&gt;
|-&lt;br /&gt;
| [http://findbugs.sourceforge.net/ FindBugs]&lt;br /&gt;
| Java&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [https://find-sec-bugs.github.io/ Find Security Bugs]&lt;br /&gt;
| Java, Scala, Groovy&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [https://dwheeler.com/flawfinder/ FlawFinder]&lt;br /&gt;
| C, C++&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [https://docs.microsoft.com/en-us/previous-versions/dotnet/netframework-3.0/bb429476(v=vs.80) Microsoft FxCop]&lt;br /&gt;
| .NET&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [https://security-code-scan.github.io/ .NET Security Guard]&lt;br /&gt;
| .NET, C#, VB.net&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/FloeDesignTechnologies/phpcs-security-audit phpcs-security-audit]&lt;br /&gt;
| PHP&lt;br /&gt;
| Windows, Unix&lt;br /&gt;
|-&lt;br /&gt;
| [https://pmd.github.io/ PMD]&lt;br /&gt;
| Java, JavaScript, Salesforce.com Apex and Visualforce, PLSQL, Apache Velocity, XML, XSL&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [https://www.pumascan.com/ Puma Scan]&lt;br /&gt;
| .NET, C#&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [https://docs.microsoft.com/en-us/previous-versions/windows/embedded/ms933794(v=msdn.10) Microsoft PREFast]&lt;br /&gt;
| C, C++&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://rips-scanner.sourceforge.net/ RIPS Open Source]&lt;br /&gt;
| PHP&lt;br /&gt;
| any&lt;br /&gt;
|-&lt;br /&gt;
| [https://sonarcloud.io/about SonarCloud]&lt;br /&gt;
| ABAP, C, C++, Objective-C, COBOL, C#, CSS, Flex, Go, HTML, Java, Javascript, Kotlin, PHP, PL/I, PL/SQL, Python, RPG, Ruby, Swift, T-SQL, TypeScript, VB6, VB, XML&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [https://www.splint.org/ Splint]&lt;br /&gt;
| C&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [https://sourceforge.net/projects/visualcodegrepp/ VisualCodeGrepper]&lt;br /&gt;
| C/C++, C#, VB, PHP, Java, PL/SQL&lt;br /&gt;
| Windows&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Commercial ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Software&lt;br /&gt;
! Language(s)&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| [https://www.ripstech.com/product/ RIPS]&lt;br /&gt;
| Java, PHP&lt;br /&gt;
| OWASP Member&lt;br /&gt;
|-&lt;br /&gt;
| [https://www.microfocus.com/en-us/products/static-code-analysis-sast/overview Fortify]&lt;br /&gt;
| ABAP/BSP, ActionScript/MXML (Flex), ASP.NET, VB.NET, C# (.NET), C/C++, Classic ASP (w/VBScript), COBOL, ColdFusion CFML, HTML, Java (including Android), JavaScript/AJAX, JSP, Objective-C, PHP, PL/SQL, Python, T-SQL, Ruby, Swift, Visual Basic, VBScript, XML&lt;br /&gt;
| OWASP Member&lt;br /&gt;
|-&lt;br /&gt;
| [https://www.veracode.com/ Veracode]&lt;br /&gt;
| Android, ASP.NET, C#, C, C++, Classic ASP, COBOL, ColdFusion/Java, Go, Groovy, iOS, Java, JavaScript, Perl, PhoneGap/Cordova, PHP, Python, React Native, RPG, Ruby on Rails, Scala, Titanium, TypeScript, VB.NET, Visual Basic 6, Xamarin&lt;br /&gt;
| OWASP Member&lt;br /&gt;
|-&lt;br /&gt;
| [https://www.grammatech.com/ CodeSonar]&lt;br /&gt;
| C, C++, Java&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [https://www.parasoft.com/ ParaSoft]&lt;br /&gt;
| C, C++, Java, .NET&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;s&amp;gt;[http://www.armorize.com/codesecure/ Armorize CodeSecure]&amp;lt;/s&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| OWASP Member; acquired by Proofpoint in 2013&lt;br /&gt;
|-&lt;br /&gt;
| [https://www.checkmarx.com/ Checkmarx Static Code Analysis]&lt;br /&gt;
| Android, Apex, ASP.NET, C#, C++, Go, Groovy, HTML5, Java, JavaScript, JSP, .NET, Objective-C, Perl, PHP, PL/SQL, Python, Ruby, Scala, Swift, TypeScript, VB.NET, Visual Basic 6, Windows Phone&lt;br /&gt;
| OWASP Member&lt;br /&gt;
|-&lt;br /&gt;
| [https://www.ibm.com/us-en/marketplace/ibm-appscan-source IBM AppScan Source]&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [https://www.synopsys.com/software-integrity/security-testing/static-analysis-sast.html Coverity]&lt;br /&gt;
| Android, C#, C, C++, Java, JavaScript, Node.js, Objective-C, PHP, Python, Ruby, Scala, Swift, VB.NET&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [https://www.viva64.com/en/pvs-studio/ PVS-Studio]&lt;br /&gt;
| C, C++, C#&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [https://pumascan.com/pricing/ Puma Scan Professional]&lt;br /&gt;
| .NET, C#&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [https://www.roguewave.com/products-services/klocwork/static-code-analysis Klocwork]&lt;br /&gt;
| C, C++, C#, Java&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [https://www.mathworks.com/products/polyspace.html Polyspace Static Analysis]&lt;br /&gt;
| C, C++, Ada&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://www.seczone.cn/2018/06/27/codesec%E6%BA%90%E4%BB%A3%E7%A0%81%E5%AE%89%E5%85%A8%E6%A3%80%E6%B5%8B%E5%B9%B3%E5%8F%B0/ CodeSec]&lt;br /&gt;
| C, C++, C#, Java, JavaScript, PHP, Kotlin, Lua, Scala, TypeScript, Android&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://www.xanitizer.net Xanitizer]&lt;br /&gt;
| Java, Scala&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Other Tool Lists===&lt;br /&gt;
&lt;br /&gt;
* [http://samate.nist.gov/index.php/Source_Code_Security_Analyzers.html NIST - Source Code Security Analyzers]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis Wikipedia - List of tools for static code analysis]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
[0] {{cite web |url=http://www.software-supportability.org/Docs/00-55_Part_2.pdf |title=Requirements for Safety Related Software in Defence Equipment |date=August 1, 1997 |format=pdf |publisher=Ministry of Defence |access-date=December 17, 2018}}&lt;br /&gt;
&lt;br /&gt;
== Further Reading ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.owasp.org/images/2/2e/OWASP_Code_Review_Guide-V1_1.pdf OWASP Code Review Guide v1.1]&lt;br /&gt;
* http://www.crosstalkonline.org/storage/issue-archives/2003/200311/200311-German.pdf&lt;br /&gt;
* http://www.ida.liu.se/~TDDC90/papers/industrial95.pdf&lt;br /&gt;
* http://www.php-security.org/downloads/rips.pdf&lt;br /&gt;
* http://www.seclab.tuwien.ac.at/papers/pixy.pdf&lt;br /&gt;
&lt;br /&gt;
[[Category:FIXME|&lt;br /&gt;
In addition, one should classify control based on the following subcategories: Ex:&amp;lt;nowiki&amp;gt;[[Category:Error Handling Control]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Availability Control&lt;br /&gt;
Authorization Control&lt;br /&gt;
Authentication Control&lt;br /&gt;
Concurrency Control&lt;br /&gt;
Configuration Control&lt;br /&gt;
Cryptographic Control&lt;br /&gt;
Encoding Control&lt;br /&gt;
Error Handling Control&lt;br /&gt;
Input Validation Control&lt;br /&gt;
Logging and Auditing Control&lt;br /&gt;
Session Management Control&lt;br /&gt;
]]&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
&lt;br /&gt;
[[Category:Control]]&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Source_Code_Analysis_Tools&amp;diff=255499</id>
		<title>Source Code Analysis Tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Source_Code_Analysis_Tools&amp;diff=255499"/>
				<updated>2019-10-16T10:25:29Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* Commercial Tools Of This Type */ xanitizer with scala&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Static_Code_Analysis | Source code analysis]] tools, also referred to as Static Application Security Testing (SAST) Tools, are designed to analyze source code and/or compiled versions of code to help find security flaws. &lt;br /&gt;
&lt;br /&gt;
Some tools are starting to move into the IDE. For the types of problems that can be detected during the software development phase itself, this is a powerful phase within the development life cycle to employ such tools, as it provides immediate feedback to the developer on issues they might be introducing into the code during code development itself. This immediate feedback is very useful, especially when compared to finding vulnerabilities much later in the development cycle.&lt;br /&gt;
&lt;br /&gt;
== Strengths and Weaknesses ==&lt;br /&gt;
&lt;br /&gt;
=== Strengths ===&lt;br /&gt;
&lt;br /&gt;
* Scales well -- can be run on lots of software, and can be run repeatedly (as with nightly builds or continuous integration)&lt;br /&gt;
* Useful for things that such tools can automatically find with high confidence, such as buffer overflows, SQL Injection Flaws, and so forth&lt;br /&gt;
* Output is good for developers -- highlights the precise source files, line numbers, and even subsections of lines that are affected&lt;br /&gt;
&lt;br /&gt;
=== Weaknesses ===&lt;br /&gt;
&lt;br /&gt;
* Many types of security vulnerabilities are difficult to find automatically, such as authentication problems, access control issues, insecure use of cryptography, etc. The current state of the art only allows such tools to automatically find a relatively small percentage of application security flaws. However, tools of this type are getting better.&lt;br /&gt;
* High numbers of false positives.&lt;br /&gt;
* Frequently can't find configuration issues, since they are not represented in the code.&lt;br /&gt;
* Difficult to 'prove' that an identified security issue is an actual vulnerability.&lt;br /&gt;
* Many of these tools have difficulty analyzing code that can't be compiled. Analysts frequently can't compile code because they don't have the right libraries, all the compilation instructions, all the code, etc.&lt;br /&gt;
&lt;br /&gt;
==Important Selection Criteria==&lt;br /&gt;
&lt;br /&gt;
* Requirement: Must support your programming language, but not usually a key factor once it does.&lt;br /&gt;
* Types of vulnerabilities it can detect (out of the [[OWASP Top Ten]]?) (plus more?)&lt;br /&gt;
* How accurate is it? False Positive/False Negative rates?&lt;br /&gt;
** Does the tool have an OWASP [[Benchmark]] score?&lt;br /&gt;
* Does it understand the libraries/frameworks you use?&lt;br /&gt;
* Does it require a fully buildable set of source?&lt;br /&gt;
* Can it run against binaries instead of source?&lt;br /&gt;
* Can it be integrated into the developer's IDE?&lt;br /&gt;
* How hard is it to setup/use?&lt;br /&gt;
* Can it be run continuously and automatically?&lt;br /&gt;
* License cost for the tool. (Some are sold per user, per org, per app, per line of code analyzed. Consulting licenses are frequently different than end user licenses.)&lt;br /&gt;
&lt;br /&gt;
==OWASP Tools Of This Type==&lt;br /&gt;
&lt;br /&gt;
* [[OWASP SonarQube Project]]&lt;br /&gt;
* [http://www.owasp.org/index.php/Category:OWASP_Orizon_Project OWASP Orizon Project]&lt;br /&gt;
* [[OWASP_LAPSE_Project | OWASP LAPSE Project]]&lt;br /&gt;
* [[OWASP O2 Platform]]&lt;br /&gt;
* [[OWASP WAP-Web Application Protection]]&lt;br /&gt;
&lt;br /&gt;
==Disclaimer==&lt;br /&gt;
&lt;br /&gt;
Disclaimer: &amp;lt;b&amp;gt;The tools listed in the tables below are presented in alphabetical order. &amp;lt;i&amp;gt;OWASP does not endorse any of the vendors or tools by listing them in the table below.&amp;lt;/i&amp;gt; We have made every effort to provide this information as accurately as possible. If you are the vendor of a tool below and think that this information is incomplete or incorrect, please send an e-mail to our mailing list and we will make every effort to correct this information.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Open Source or Free Tools Of This Type==&lt;br /&gt;
&lt;br /&gt;
* [https://wiki.openstack.org/wiki/Security/Projects/Bandit Bandit] - bandit is a comprehensive source vulnerability scanner for Python&lt;br /&gt;
* [http://brakemanscanner.org/ Brakeman] - Brakeman is an open source vulnerability scanner specifically designed for Ruby on Rails applications&lt;br /&gt;
* [http://rubygems.org/gems/codesake-dawn Codesake Dawn] - Codesake Dawn is an open source security source code analyzer designed for Sinatra, Padrino for Ruby on Rails applications. It also works on non-web applications written in Ruby&lt;br /&gt;
* [https://discotek.ca/deepdive.xhtml Deep Dive] - Byte code analysis tool for discovering vulnerabilities in Java deployments (Ear, War, Jar).&lt;br /&gt;
* [http://findbugs.sourceforge.net/ FindBugs] - (Legacy - NOT Maintained - Use SpotBugs (see below) instead) - Find bugs (including a few security flaws) in Java programs&lt;br /&gt;
* [https://find-sec-bugs.github.io/ FindSecBugs] - A security specific plugin for SpotBugs that significantly improves SpotBugs's ability to find security vulnerabilities in Java programs. Works with the old FindBugs too,&lt;br /&gt;
* [http://www.dwheeler.com/flawfinder/ Flawfinder] Flawfinder - Scans C and C++&lt;br /&gt;
* [https://www.bishopfox.com/resources/tools/google-hacking-diggity/attack-tools/ Google CodeSearchDiggity] - Uses Google Code Search to identifies vulnerabilities in open source code projects hosted by Google Code, MS CodePlex, SourceForge, Github, and more. The tool comes with over 130 default searches that identify SQL injection, cross-site scripting (XSS), insecure remote and local file includes, hard-coded passwords, and much more.  ''Essentially, Google CodeSearchDiggity provides a source code security analysis of nearly every single open source code project in existence – simultaneously.''&lt;br /&gt;
* [https://github.com/wireghoul/graudit/ Graudit] - Scans multiple languages for various security flaws.&lt;br /&gt;
* [https://lgtm.com/help/lgtm/about-lgtm LGTM] - A free for open source static analysis service that automatically monitors commits to publicly accessible code in: Bitbucket Cloud, GitHub, or GitLab. Supports C/C++, C#, COBOL (in beta), Java, JavaScript/TypeScript, Python&lt;br /&gt;
* [https://dotnet-security-guard.github.io/ .NET Security Guard] - Roslyn analyzers that aim to help security audits on .NET applications. It will find SQL injections, LDAP injections, XXE, cryptography weakness, XSS and more.&lt;br /&gt;
* [https://github.com/FloeDesignTechnologies/phpcs-security-audit phpcs-security-audit] - phpcs-security-audit is a set of PHP_CodeSniffer rules that finds flaws or weaknesses related to security in PHP and its popular CMS or frameworks.  It currently has core PHP rules as well as Drupal 7 specific rules.&lt;br /&gt;
* [http://pmd.sourceforge.net/ PMD] - PMD scans Java source code and looks for potential code problems (this is a code quality tool that does not focus on security issues)&lt;br /&gt;
* [http://msdn.microsoft.com/en-us/library/ms933794.aspx PreFast] (Microsoft) - PREfast is a static analysis tool that identifies defects in C/C++ programs. Last update 2006.&lt;br /&gt;
* [https://github.com/designsecurity/progpilot Progpilot] - Progpilot is a static analyzer tool for PHP that detects security vulnerabilities such as XSS and SQL Injection.&lt;br /&gt;
* [https://pumascan.com/ Puma Scan] - Puma Scan is a .NET C# open source static source code analyzer that runs as an IDE plugin for Visual Studio and via MSBuild in CI pipelines.&lt;br /&gt;
* [https://pyre-check.org/ Pyre] - A performant type-checker for Python 3, that also has [https://pyre-check.org/docs/static-analysis.html limited security/data flow analysis] capabilities.&lt;br /&gt;
* [http://rips-scanner.sourceforge.net/ RIPS] - RIPS Open Source is a static source code analyzer for vulnerabilities in PHP web applications. Please see notes on the sourceforge.net site.&lt;br /&gt;
* [https://discotek.ca/sinktank.xhtml Sink Tank] - Byte code static code analyzer for performing source/sink (taint) analysis.&lt;br /&gt;
* [http://www.sonarqube.org/ SonarQube] - Scans source code for more than 20 languages for Bugs, Vulnerabilities, and Code Smells. SonarQube IDE plugins for Eclipse, Visual Studio, and IntelliJ provided by [http://www.sonarlint.org/ SonarLint].&lt;br /&gt;
* [https://spotbugs.github.io/ SpotBugs] - This is the active fork replacement for FindBugs, which is not maintained anymore.&lt;br /&gt;
* [http://sourceforge.net/projects/visualcodegrepp/ VisualCodeGrepper (VCG)] - Scans C/C++, C#, VB, PHP, Java, and PL/SQL for security issues and for comments which may indicate defective code. The config files can be used to carry out additional checks for banned functions or functions which commonly cause security issues.&lt;br /&gt;
&lt;br /&gt;
[https://docs.gitlab.com/ee/user/application_security/sast/index.html#supported-languages-and-frameworks GitLab has lashed a free SAST tool for a bunch of different languages natively into GitLab. So you might be able to use that, or at least identify a free SAST tool for the language you need from that list].&lt;br /&gt;
&lt;br /&gt;
==Commercial Tools Of This Type==&lt;br /&gt;
* [https://www.ptsecurity.com/ww-en/products/ai/ Application Inspector] (Positive Technologies) - combines SAST, DAST, IAST, SCA, configuration analysis and other technologies, incl. unique abstract interpretation; has capability to generate test queries (exploits) to verify detected vulnerabilities during SAST analysis; Supported languages include: Java, C#, PHP, JavaScript, Objective C, VB.Net, PL/SQL, T-SQL, and others. &lt;br /&gt;
* [https://www.ibm.com/us-en/marketplace/application-security-on-cloud Application Security on Cloud] (IBM) - Provides SAST, DAST and mobile security testing as well as OpenSource library known vulnerability detection as a cloud service. &lt;br /&gt;
* [https://www.ibm.com/us-en/marketplace/ibm-appscan-source AppScan Source] (IBM)&lt;br /&gt;
* [https://www.blueclosure.com BlueClosure BC Detect] (BlueClosure) - Analyzes client-side JavaScript.&lt;br /&gt;
* [https://bugscout.io/en/ bugScout] (Nalbatech, Formally Buguroo)&lt;br /&gt;
* [https://www.castsoftware.com/products/application-intelligence-platform CAST AIP] (CAST) Performs static and architectural analysis to identify numerous types of security issues. Supports over 30 languages. [https://www.castsoftware.com/solutions/application-security/cwe#SupportedSecurityStandards AIP's security specific coverage is here].&lt;br /&gt;
* [https://www.codacy.com/ Codacy] Offers security patterns for languages such as Python, Ruby, Scala, Java, JavaScript and more. Integrates with tools such as Brakeman, Bandit, FindBugs, and others. (free for open source projects)&lt;br /&gt;
* [https://www.grammatech.com/products/codesonar CodeSonar] tool that supports C, C++, Java and C# and maps against the OWASP top 10 vulnerabilities.&lt;br /&gt;
* [https://www.contrastsecurity.com/interactive-application-security-testing-iast Contrast Assess] (Contrast Security) - Contrast performs code security without actually doing static analysis. Contrast does Interactive Application Security Testing (IAST), correlating runtime code &amp;amp; data analysis. It provides code level results without actually relying on static analysis.&lt;br /&gt;
* [http://www.coverity.com/products/code-advisor/ Coverity Code Advisor] (Synopsys)&lt;br /&gt;
* [https://www.checkmarx.com/technology/static-code-analysis-sca/ CxSAST] (Checkmarx)&lt;br /&gt;
* [https://www.microfocus.com/en-us/products/static-code-analysis-sast Fortify] (Micro Focus, Formally HP)&lt;br /&gt;
* [https://hdivsecurity.com/interactive-application-security-testing-iast Hdiv Detection] (Hdiv Security) - Hdiv performs code security without actually doing static analysis. Hdiv does Interactive Application Security Testing (IAST), correlating runtime code &amp;amp; data analysis. It provides code-level results without actually relying on static analysis.&lt;br /&gt;
* [http://www.juliasoft.com/solutions Julia] (JuliaSoft) - SaaS Java static analysis&lt;br /&gt;
* [http://www.klocwork.com/capabilities/static-code-analysis KlocWork] (KlocWork)&lt;br /&gt;
* [https://www.kiuwan.com/code-analysis/ Kiuwan] (an [http://www.optimyth.com Optimyth] company) - SaaS Software Quality &amp;amp; Security Analysis&lt;br /&gt;
* [http://www.parasoft.com/jsp/capabilities/static_analysis.jsp?itemId=547 Parasoft Test] (Parasoft)&lt;br /&gt;
* [https://pitss.com/products/pitss-con/ PITSS.CON] (PITTS)&lt;br /&gt;
* [https://www.ptsecurity.com/ww-en/products/ai/ PT Application Inspector] combines SAST, DAST, IAST, SCA, configuration analysis and other technologies, incl. unique abstract interpretation for high accuracy rate with minimum false positives; has a unique capability to generate special test queries (exploits) to verify detected vulnerabilities during SAST analysis; integrates with CI/CD, VCS, etc. PT AI helps to easily understand, verify, and fix flaws; has a simple UI; is highly automated and easy to use. Supported languages are Java, C#, PHP, JavaScript, Objective C, VB.Net, PL/SQL, T-SQL, and others.&lt;br /&gt;
* [https://pumascanpro.com/ Puma Scan Professional] - A .NET C# static source code analyzer that runs as a Visual Studio IDE extension, Azure DevOps extension, and Command Line (CLI) executable.&lt;br /&gt;
* [http://www.viva64.com/en/ PVS-Studio] (PVS-Studio) - For C/C++, C#&lt;br /&gt;
* [https://www.softwaresecured.com/reshift reshift] - A CI/CD tool that uses static code analysis to scan for vulnerabilities and uses machine learning to give a prediction on false positives. Supports Java with future support for NodeJS and JavaScript planned for sometime in 2019.&lt;br /&gt;
* [https://www.ripstech.com/ RIPS Code Analysis] (RIPS Technologies) - A SAST solution specialized for Java and PHP that detects unknown security vulnerabilities and code quality issues.&lt;br /&gt;
* [https://www.synopsys.com/software-integrity/resources/datasheets/secureassist.html SecureAssist] (Synopsys) - Scans code for insecure coding and configurations automatically as an IDE plugin for Eclipse, IntelliJ, and Visual Studio etc. Supports (Java, .NET, PHP, and JavaScript)&lt;br /&gt;
* [https://www.whitehatsec.com/products/static-application-security-testing/ Sentinel Source] (Whitehat)&lt;br /&gt;
* [https://www.synopsys.com/software-integrity/products/interactive-application-security-testing.html Seeker] (Synopsys) Seeker performs code security without actually doing static analysis. Seeker does Interactive Application Security Testing (IAST), correlating runtime code &amp;amp; data analysis with simulated attacks. It provides code level results without actually relying on static analysis.&lt;br /&gt;
* [http://www.sourcepatrol.co.uk/ Source Patrol] (Pentest)&lt;br /&gt;
* [https://www.defensecode.com/thunderscan.php Thunderscan SAST] (DefenseCode)&lt;br /&gt;
* [http://www.veracode.com/products/binary-static-analysis-sast Veracode Static Analysis] (Veracode)&lt;br /&gt;
* [http://www.xanitizer.net Xanitizer] - Scans Java and Scala for security vulnerabilities, mainly via taint analysis. Free for academic and open source projects (see [https://www.rigs-it.com/xanitizer-pricing/]).&lt;br /&gt;
&lt;br /&gt;
==More info==&lt;br /&gt;
&lt;br /&gt;
* [[Appendix_A:_Testing_Tools | Appendix A: Testing Tools]]&lt;br /&gt;
* [http://samate.nist.gov/index.php/Source_Code_Security_Analyzers.html NIST's list of Source Code Security Analysis Tools]&lt;br /&gt;
* [[:Category:Vulnerability_Scanning_Tools | DAST Tools]] - Similar info on Dynamic Application Security Testing (DAST) Tools&lt;br /&gt;
* [[Free for Open Source Application Security Tools]] - This page lists the Commercial Source Code Analysis Tools (SAST) we know of that are free for Open Source&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP .NET Project]]&lt;br /&gt;
[[Category:SAMM-CR-2]]&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=255092</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=255092"/>
				<updated>2019-09-30T21:30:49Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* User Documentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
=====Results=====&lt;br /&gt;
&lt;br /&gt;
:Results of checks are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.  This leaves the proper&lt;br /&gt;
:interpretation, if the result is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;, to the user.&lt;br /&gt;
:Background:  it is not always possible to rate a result as  &amp;quot;good&amp;quot; or&lt;br /&gt;
:&amp;quot;bad&amp;quot; or &amp;quot;insecure&amp;quot; or whatever. That's why  O-Saft  can not give the&lt;br /&gt;
:&amp;quot;the best&amp;quot; or a &amp;quot;proper&amp;quot; recomendation. In practice it depends on the&lt;br /&gt;
:context what a recomendation, or countermeasure should be. That's why&lt;br /&gt;
:all results are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  if considered &amp;quot;questionable&amp;quot;&lt;br /&gt;
:or &amp;quot;not good&amp;quot; (for example according other checks).&lt;br /&gt;
&lt;br /&gt;
:... more comming soon ...&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
&lt;br /&gt;
:Above applies to all commands except ''+cipherall'' and ''+cipherraw'' which  &lt;br /&gt;
:uses no other libraries.&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is usefull  if the certificate and the configuration must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt;    can be any string accepeted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Usefull if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. To start  ''o-saft.pl''  inside&lt;br /&gt;
:the Docker image, use following:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:or&lt;br /&gt;
   docker run --rm -it owasp/o-saft +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
====BUILD DOCKER IMAGE====&lt;br /&gt;
&lt;br /&gt;
:The Docker image can be installed as follows:&lt;br /&gt;
&lt;br /&gt;
   docker pull owasp/o-saft&lt;br /&gt;
&lt;br /&gt;
:The image can also easily be build from the Dockerfile (which is part&lt;br /&gt;
:of the distribution) as follows:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker build&lt;br /&gt;
&lt;br /&gt;
:To build the image from the Dockerfile with docker commands, see:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -n build&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
====DOCUMENTATION====&lt;br /&gt;
&lt;br /&gt;
=====User Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation is mainly intented for the user, which is provided with&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
:But it may be difficult to find the proper information there.  To get&lt;br /&gt;
:more selective documentations, the  ''--help=*''  options can be used. To&lt;br /&gt;
:get an overview which  ''--help=*''  options are available, use:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:This only provides the complete user documentation, or the well known&lt;br /&gt;
:parts specified by the keyword, (HELP in example above).  To find any&lt;br /&gt;
:text with some lines of context, following could be used:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help | egrep -i -C 3 &amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:This is simply avaiable with:&lt;br /&gt;
&lt;br /&gt;
  o-saft -help=&amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:In the GUI a more sophisticate search is implemented, see the  &amp;quot;Help&amp;quot;&lt;br /&gt;
:window there:&lt;br /&gt;
&lt;br /&gt;
  o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
=====Developer Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation for developers is provided in various ways. Information&lt;br /&gt;
:for developers can be found found in:&lt;br /&gt;
&lt;br /&gt;
:* the files itself&lt;br /&gt;
&lt;br /&gt;
:* with:  &amp;lt;code&amp;gt;o-saft.pl --help=HELP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:* using:  &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 19.09.19&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=255091</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=255091"/>
				<updated>2019-09-30T20:35:29Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* Developer Documentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
=====Results=====&lt;br /&gt;
&lt;br /&gt;
:Results of checks are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.  This leaves the proper&lt;br /&gt;
:interpretation, if the result is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;, to the user.&lt;br /&gt;
:Background:  it is not always possible to rate a result as  &amp;quot;good&amp;quot; or&lt;br /&gt;
:&amp;quot;bad&amp;quot; or &amp;quot;insecure&amp;quot; or whatever. That's why  O-Saft  can not give the&lt;br /&gt;
:&amp;quot;the best&amp;quot; or a &amp;quot;proper&amp;quot; recomendation. In practice it depends on the&lt;br /&gt;
:context what a recomendation, or countermeasure should be. That's why&lt;br /&gt;
:all results are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  if considered &amp;quot;questionable&amp;quot;&lt;br /&gt;
:or &amp;quot;not good&amp;quot; (for example according other checks).&lt;br /&gt;
&lt;br /&gt;
:... more comming soon ...&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
&lt;br /&gt;
:Above applies to all commands except ''+cipherall'' and ''+cipherraw'' which  &lt;br /&gt;
:uses no other libraries.&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is usefull  if the certificate and the configuration must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt;    can be any string accepeted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Usefull if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. To start  ''o-saft.pl''  inside&lt;br /&gt;
:the Docker image, use following:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:or&lt;br /&gt;
   docker run --rm -it owasp/o-saft +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
====BUILD DOCKER IMAGE====&lt;br /&gt;
&lt;br /&gt;
:The Docker image can be installed as follows:&lt;br /&gt;
&lt;br /&gt;
   docker pull owasp/o-saft&lt;br /&gt;
&lt;br /&gt;
:The image can also easily be build from the Dockerfile (which is part&lt;br /&gt;
:of the distribution) as follows:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker build&lt;br /&gt;
&lt;br /&gt;
:To build the image from the Dockerfile with docker commands, see:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -n build&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
====DOCUMENTATION====&lt;br /&gt;
&lt;br /&gt;
=====User Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation is mainly intented for the user, which is provided with&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
:But it may be difficult to find the proper information there.  To get&lt;br /&gt;
:more selective documentations, the  ''--help=*''  options can be used. To&lt;br /&gt;
:get an overview which  ''--help=*''  options are available, use:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:This only provides the complete user documentation, or the well known&lt;br /&gt;
:parts specified by the keyword, (HELP in example above).  To find any&lt;br /&gt;
:text with some lines of context, following could be used:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help | egrep -i -C 3 &amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:This is simply avaiable with:&lt;br /&gt;
&lt;br /&gt;
  o-saft -help=&amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=====Developer Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation for developers is provided in various ways. Information&lt;br /&gt;
:for developers can be found found in:&lt;br /&gt;
&lt;br /&gt;
:* the files itself&lt;br /&gt;
&lt;br /&gt;
:* with:  &amp;lt;code&amp;gt;o-saft.pl --help=HELP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:* using:  &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 19.09.19&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=255090</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=255090"/>
				<updated>2019-09-30T20:34:42Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* User Documentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
=====Results=====&lt;br /&gt;
&lt;br /&gt;
:Results of checks are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.  This leaves the proper&lt;br /&gt;
:interpretation, if the result is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;, to the user.&lt;br /&gt;
:Background:  it is not always possible to rate a result as  &amp;quot;good&amp;quot; or&lt;br /&gt;
:&amp;quot;bad&amp;quot; or &amp;quot;insecure&amp;quot; or whatever. That's why  O-Saft  can not give the&lt;br /&gt;
:&amp;quot;the best&amp;quot; or a &amp;quot;proper&amp;quot; recomendation. In practice it depends on the&lt;br /&gt;
:context what a recomendation, or countermeasure should be. That's why&lt;br /&gt;
:all results are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  if considered &amp;quot;questionable&amp;quot;&lt;br /&gt;
:or &amp;quot;not good&amp;quot; (for example according other checks).&lt;br /&gt;
&lt;br /&gt;
:... more comming soon ...&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
&lt;br /&gt;
:Above applies to all commands except ''+cipherall'' and ''+cipherraw'' which  &lt;br /&gt;
:uses no other libraries.&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is usefull  if the certificate and the configuration must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt;    can be any string accepeted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Usefull if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. To start  ''o-saft.pl''  inside&lt;br /&gt;
:the Docker image, use following:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:or&lt;br /&gt;
   docker run --rm -it owasp/o-saft +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
====BUILD DOCKER IMAGE====&lt;br /&gt;
&lt;br /&gt;
:The Docker image can be installed as follows:&lt;br /&gt;
&lt;br /&gt;
   docker pull owasp/o-saft&lt;br /&gt;
&lt;br /&gt;
:The image can also easily be build from the Dockerfile (which is part&lt;br /&gt;
:of the distribution) as follows:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker build&lt;br /&gt;
&lt;br /&gt;
:To build the image from the Dockerfile with docker commands, see:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -n build&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
====DOCUMENTATION====&lt;br /&gt;
&lt;br /&gt;
=====User Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation is mainly intented for the user, which is provided with&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
:But it may be difficult to find the proper information there.  To get&lt;br /&gt;
:more selective documentations, the  ''--help=*''  options can be used. To&lt;br /&gt;
:get an overview which  ''--help=*''  options are available, use:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:This only provides the complete user documentation, or the well known&lt;br /&gt;
:parts specified by the keyword, (HELP in example above).  To find any&lt;br /&gt;
:text with some lines of context, following could be used:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help | egrep -i -C 3 &amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:This is simply avaiable with:&lt;br /&gt;
&lt;br /&gt;
  o-saft -help=&amp;quot;some text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=====Developer Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation for developers is provided in various ways. Information&lt;br /&gt;
:for developers can be found found in:&lt;br /&gt;
&lt;br /&gt;
:* the files itself&lt;br /&gt;
&lt;br /&gt;
:* with:  o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* using:  make&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 19.09.19&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=255089</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=255089"/>
				<updated>2019-09-30T20:33:35Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: DOCUMENTATION added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
=====Results=====&lt;br /&gt;
&lt;br /&gt;
:Results of checks are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.  This leaves the proper&lt;br /&gt;
:interpretation, if the result is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;, to the user.&lt;br /&gt;
:Background:  it is not always possible to rate a result as  &amp;quot;good&amp;quot; or&lt;br /&gt;
:&amp;quot;bad&amp;quot; or &amp;quot;insecure&amp;quot; or whatever. That's why  O-Saft  can not give the&lt;br /&gt;
:&amp;quot;the best&amp;quot; or a &amp;quot;proper&amp;quot; recomendation. In practice it depends on the&lt;br /&gt;
:context what a recomendation, or countermeasure should be. That's why&lt;br /&gt;
:all results are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  if considered &amp;quot;questionable&amp;quot;&lt;br /&gt;
:or &amp;quot;not good&amp;quot; (for example according other checks).&lt;br /&gt;
&lt;br /&gt;
:... more comming soon ...&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
&lt;br /&gt;
:Above applies to all commands except ''+cipherall'' and ''+cipherraw'' which  &lt;br /&gt;
:uses no other libraries.&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is usefull  if the certificate and the configuration must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt;    can be any string accepeted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Usefull if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. To start  ''o-saft.pl''  inside&lt;br /&gt;
:the Docker image, use following:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:or&lt;br /&gt;
   docker run --rm -it owasp/o-saft +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
====BUILD DOCKER IMAGE====&lt;br /&gt;
&lt;br /&gt;
:The Docker image can be installed as follows:&lt;br /&gt;
&lt;br /&gt;
   docker pull owasp/o-saft&lt;br /&gt;
&lt;br /&gt;
:The image can also easily be build from the Dockerfile (which is part&lt;br /&gt;
:of the distribution) as follows:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker build&lt;br /&gt;
&lt;br /&gt;
:To build the image from the Dockerfile with docker commands, see:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -n build&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
====DOCUMENTATION====&lt;br /&gt;
&lt;br /&gt;
=====User Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation is mainly intented for the user, which is provided with&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
:But it may be difficult to find the proper information there.  To get&lt;br /&gt;
:more selective documentations, the  ''--help=*''  options can be used. To&lt;br /&gt;
:get an overview which  ''--help=*''  options are available, use:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:This only provides the complete user documentation, or the well known&lt;br /&gt;
:parts specified by the keyword, (HELP in example above).  To find any&lt;br /&gt;
:text with some lines of context, following could be used:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl --help | egrep -i -C 3 &amp;lt;code&amp;gt;some text&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:This is simply avaiable with:&lt;br /&gt;
&lt;br /&gt;
:o-saft -help=&amp;lt;code&amp;gt;some text&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Developer Documentation=====&lt;br /&gt;
&lt;br /&gt;
:Documentation for developers is provided in various ways. Information&lt;br /&gt;
:for developers can be found found in:&lt;br /&gt;
&lt;br /&gt;
:* the files itself&lt;br /&gt;
&lt;br /&gt;
:* with:  o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* using:  make&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 19.09.19&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=254704</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=254704"/>
				<updated>2019-09-12T21:13:01Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* VERSION */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
=====Results=====&lt;br /&gt;
&lt;br /&gt;
:Results of checks are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.  This leaves the proper&lt;br /&gt;
:interpretation, if the result is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;, to the user.&lt;br /&gt;
:Background:  it is not always possible to rate a result as  &amp;quot;good&amp;quot; or&lt;br /&gt;
:&amp;quot;bad&amp;quot; or &amp;quot;insecure&amp;quot; or whatever. That's why  O-Saft  can not give the&lt;br /&gt;
:&amp;quot;the best&amp;quot; or a &amp;quot;proper&amp;quot; recomendation. In practice it depends on the&lt;br /&gt;
:context what a recomendation, or countermeasure should be. That's why&lt;br /&gt;
:all results are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  if considered &amp;quot;questionable&amp;quot;&lt;br /&gt;
:or &amp;quot;not good&amp;quot; (for example according other checks).&lt;br /&gt;
&lt;br /&gt;
:... more comming soon ...&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
&lt;br /&gt;
:Above applies to all commands except ''+cipherall'' and ''+cipherraw'' which  &lt;br /&gt;
:uses no other libraries.&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is usefull  if the certificate and the configuration must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt;    can be any string accepeted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Usefull if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. To start  ''o-saft.pl''  inside&lt;br /&gt;
:the Docker image, use following:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:or&lt;br /&gt;
   docker run --rm -it owasp/o-saft +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
====BUILD DOCKER IMAGE====&lt;br /&gt;
&lt;br /&gt;
:The Docker image can be installed as follows:&lt;br /&gt;
&lt;br /&gt;
   docker pull owasp/o-saft&lt;br /&gt;
&lt;br /&gt;
:The image can also easily be build from the Dockerfile (which is part&lt;br /&gt;
:of the distribution) as follows:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker build&lt;br /&gt;
&lt;br /&gt;
:To build the image from the Dockerfile with docker commands, see:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -n build&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 19.09.19&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=254703</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=254703"/>
				<updated>2019-09-12T21:10:37Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: BUILD DOCKER IMAGE  added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
=====Results=====&lt;br /&gt;
&lt;br /&gt;
:Results of checks are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.  This leaves the proper&lt;br /&gt;
:interpretation, if the result is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;, to the user.&lt;br /&gt;
:Background:  it is not always possible to rate a result as  &amp;quot;good&amp;quot; or&lt;br /&gt;
:&amp;quot;bad&amp;quot; or &amp;quot;insecure&amp;quot; or whatever. That's why  O-Saft  can not give the&lt;br /&gt;
:&amp;quot;the best&amp;quot; or a &amp;quot;proper&amp;quot; recomendation. In practice it depends on the&lt;br /&gt;
:context what a recomendation, or countermeasure should be. That's why&lt;br /&gt;
:all results are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  if considered &amp;quot;questionable&amp;quot;&lt;br /&gt;
:or &amp;quot;not good&amp;quot; (for example according other checks).&lt;br /&gt;
&lt;br /&gt;
:... more comming soon ...&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
&lt;br /&gt;
:Above applies to all commands except ''+cipherall'' and ''+cipherraw'' which  &lt;br /&gt;
:uses no other libraries.&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is usefull  if the certificate and the configuration must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt;    can be any string accepeted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Usefull if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. To start  ''o-saft.pl''  inside&lt;br /&gt;
:the Docker image, use following:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:or&lt;br /&gt;
   docker run --rm -it owasp/o-saft +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
====BUILD DOCKER IMAGE====&lt;br /&gt;
&lt;br /&gt;
:The Docker image can be installed as follows:&lt;br /&gt;
&lt;br /&gt;
   docker pull owasp/o-saft&lt;br /&gt;
&lt;br /&gt;
:The image can also easily be build from the Dockerfile (which is part&lt;br /&gt;
:of the distribution) as follows:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker build&lt;br /&gt;
&lt;br /&gt;
:To build the image from the Dockerfile with docker commands, see:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -n build&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 16.09.16&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=254702</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=254702"/>
				<updated>2019-09-12T21:08:48Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* DOCKER */ updated&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
=====Results=====&lt;br /&gt;
&lt;br /&gt;
:Results of checks are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.  This leaves the proper&lt;br /&gt;
:interpretation, if the result is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;, to the user.&lt;br /&gt;
:Background:  it is not always possible to rate a result as  &amp;quot;good&amp;quot; or&lt;br /&gt;
:&amp;quot;bad&amp;quot; or &amp;quot;insecure&amp;quot; or whatever. That's why  O-Saft  can not give the&lt;br /&gt;
:&amp;quot;the best&amp;quot; or a &amp;quot;proper&amp;quot; recomendation. In practice it depends on the&lt;br /&gt;
:context what a recomendation, or countermeasure should be. That's why&lt;br /&gt;
:all results are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  if considered &amp;quot;questionable&amp;quot;&lt;br /&gt;
:or &amp;quot;not good&amp;quot; (for example according other checks).&lt;br /&gt;
&lt;br /&gt;
:... more comming soon ...&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
&lt;br /&gt;
:Above applies to all commands except ''+cipherall'' and ''+cipherraw'' which  &lt;br /&gt;
:uses no other libraries.&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is usefull  if the certificate and the configuration must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt;    can be any string accepeted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Usefull if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. To start  ''o-saft.pl''  inside&lt;br /&gt;
:the Docker image, use following:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:or&lt;br /&gt;
   docker run --rm -it owasp/o-saft +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 16.09.16&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=254701</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=254701"/>
				<updated>2019-09-12T21:02:07Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* Results */ typos corrected&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
=====Results=====&lt;br /&gt;
&lt;br /&gt;
:Results of checks are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.  This leaves the proper&lt;br /&gt;
:interpretation, if the result is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;, to the user.&lt;br /&gt;
:Background:  it is not always possible to rate a result as  &amp;quot;good&amp;quot; or&lt;br /&gt;
:&amp;quot;bad&amp;quot; or &amp;quot;insecure&amp;quot; or whatever. That's why  O-Saft  can not give the&lt;br /&gt;
:&amp;quot;the best&amp;quot; or a &amp;quot;proper&amp;quot; recomendation. In practice it depends on the&lt;br /&gt;
:context what a recomendation, or countermeasure should be. That's why&lt;br /&gt;
:all results are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  if considered &amp;quot;questionable&amp;quot;&lt;br /&gt;
:or &amp;quot;not good&amp;quot; (for example according other checks).&lt;br /&gt;
&lt;br /&gt;
:... more comming soon ...&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
&lt;br /&gt;
:Above applies to all commands except ''+cipherall'' and ''+cipherraw'' which  &lt;br /&gt;
:uses no other libraries.&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is usefull  if the certificate and the configuration must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt;    can be any string accepeted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Usefull if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. With  ''o-saft-docker'' and a&lt;br /&gt;
:''Dockerfile'' (both are part of the distribution), a proper Docker image&lt;br /&gt;
:will be build easily. o-saft-docker  can also be used to run commands&lt;br /&gt;
:with ''o-saft.pl'' inside the Docker image, example:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 16.09.16&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=254700</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=254700"/>
				<updated>2019-09-12T21:01:22Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* CONCEPTS */  Results added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
=====Results=====&lt;br /&gt;
&lt;br /&gt;
:Results of checks are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.  This leaves the prop&lt;br /&gt;
er&lt;br /&gt;
:interpretation, if the result is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;, to the user.&lt;br /&gt;
:Background:  it is not always possible to rate a result as  &amp;quot;good&amp;quot; or&lt;br /&gt;
:&amp;quot;bad&amp;quot; or &amp;quot;insecure&amp;quot; or whatever. That's why  O-Saft  can not give the&lt;br /&gt;
:&amp;quot;the best&amp;quot; or a &amp;quot;proper&amp;quot; recomendation. In practice it depends on the&lt;br /&gt;
:context what a recomendation, or countermeasure should be. That's why&lt;br /&gt;
:all results are marked  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  if considered &amp;quot;questionabl&lt;br /&gt;
e&amp;quot;&lt;br /&gt;
:or &amp;quot;not good&amp;quot; (for example according other checks).&lt;br /&gt;
&lt;br /&gt;
:... more comming soon ...&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
&lt;br /&gt;
:Above applies to all commands except ''+cipherall'' and ''+cipherraw'' which  &lt;br /&gt;
:uses no other libraries.&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is usefull  if the certificate and the configuration must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt;    can be any string accepeted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Usefull if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. With  ''o-saft-docker'' and a&lt;br /&gt;
:''Dockerfile'' (both are part of the distribution), a proper Docker image&lt;br /&gt;
:will be build easily. o-saft-docker  can also be used to run commands&lt;br /&gt;
:with ''o-saft.pl'' inside the Docker image, example:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 16.09.16&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=254699</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=254699"/>
				<updated>2019-09-12T20:46:39Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: CONCEPTS added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
====CONCEPTS====&lt;br /&gt;
&lt;br /&gt;
:The purpose of  O-Saft  is to do the work,  not to force the user  to&lt;br /&gt;
:learn a new tool or to install &amp;quot;newer&amp;quot; software first.&lt;br /&gt;
:However, the user &amp;quot;should do something&amp;quot; if necessary depending on the&lt;br /&gt;
:reported results.&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
&lt;br /&gt;
:Above applies to all commands except ''+cipherall'' and ''+cipherraw'' which  &lt;br /&gt;
:uses no other libraries.&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is usefull  if the certificate and the configuration must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt;    can be any string accepeted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Usefull if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. With  ''o-saft-docker'' and a&lt;br /&gt;
:''Dockerfile'' (both are part of the distribution), a proper Docker image&lt;br /&gt;
:will be build easily. o-saft-docker  can also be used to run commands&lt;br /&gt;
:with ''o-saft.pl'' inside the Docker image, example:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 16.09.16&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=254698</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=254698"/>
				<updated>2019-09-12T20:40:32Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* QUICKSTART */ --help=HELP and -help=context added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:* List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:* Show all  --help=*  commands&lt;br /&gt;
    o-saft.pl --help=HELP&lt;br /&gt;
&lt;br /&gt;
:* Search for text in O-Saft's help and show with context&lt;br /&gt;
    o-saft -help=your-text&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:* Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
&lt;br /&gt;
:Above applies to all commands except ''+cipherall'' and ''+cipherraw'' which  &lt;br /&gt;
:uses no other libraries.&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is usefull  if the certificate and the configuration must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt;    can be any string accepeted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Usefull if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. With  ''o-saft-docker'' and a&lt;br /&gt;
:''Dockerfile'' (both are part of the distribution), a proper Docker image&lt;br /&gt;
:will be build easily. o-saft-docker  can also be used to run commands&lt;br /&gt;
:with ''o-saft.pl'' inside the Docker image, example:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 16.09.16&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=254626</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=254626"/>
				<updated>2019-09-09T19:23:33Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* Public Key Modulus Exponent size */ typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:*       List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:*       Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:*       Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
&lt;br /&gt;
:Above applies to all commands except ''+cipherall'' and ''+cipherraw'' which  &lt;br /&gt;
:uses no other libraries.&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is usefull  if the certificate and the configuration must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt;    can be any string accepeted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Usefull if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptic curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. With  ''o-saft-docker'' and a&lt;br /&gt;
:''Dockerfile'' (both are part of the distribution), a proper Docker image&lt;br /&gt;
:will be build easily. o-saft-docker  can also be used to run commands&lt;br /&gt;
:with ''o-saft.pl'' inside the Docker image, example:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 16.09.16&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=254625</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=254625"/>
				<updated>2019-09-09T19:22:56Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* Sizes */ typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:*       List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:*       Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:*       Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
&lt;br /&gt;
:Above applies to all commands except ''+cipherall'' and ''+cipherraw'' which  &lt;br /&gt;
:uses no other libraries.&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is usefull  if the certificate and the configuration must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt;    can be any string accepeted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Usefull if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptive curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these checks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. With  ''o-saft-docker'' and a&lt;br /&gt;
:''Dockerfile'' (both are part of the distribution), a proper Docker image&lt;br /&gt;
:will be build easily. o-saft-docker  can also be used to run commands&lt;br /&gt;
:with ''o-saft.pl'' inside the Docker image, example:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 16.09.16&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=254624</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=254624"/>
				<updated>2019-09-09T18:57:55Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* SSTP */  typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:*       List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:*       Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:*       Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
&lt;br /&gt;
:Above applies to all commands except ''+cipherall'' and ''+cipherraw'' which  &lt;br /&gt;
:uses no other libraries.&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is usefull  if the certificate and the configuration must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt;    can be any string accepeted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Usefull if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptive curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these cjecks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. With  ''o-saft-docker'' and a&lt;br /&gt;
:''Dockerfile'' (both are part of the distribution), a proper Docker image&lt;br /&gt;
:will be build easily. o-saft-docker  can also be used to run commands&lt;br /&gt;
:with ''o-saft.pl'' inside the Docker image, example:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 16.09.16&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=254587</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=254587"/>
				<updated>2019-09-06T21:47:41Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: markup added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:*       List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:*       Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:*       Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
&lt;br /&gt;
:Above applies to all commands except ''+cipherall'' and ''+cipherraw'' which  &lt;br /&gt;
:uses no other libraries.&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is usefull  if the certificate and the configuration must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt;    can be any string accepeted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Usefull if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:the protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptive curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these cjecks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  &amp;lt;code&amp;gt;-zA-Z_0-9,.\/()-&amp;lt;/code&amp;gt;  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. With  ''o-saft-docker'' and a&lt;br /&gt;
:''Dockerfile'' (both are part of the distribution), a proper Docker image&lt;br /&gt;
:will be build easily. o-saft-docker  can also be used to run commands&lt;br /&gt;
:with ''o-saft.pl'' inside the Docker image, example:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 16.09.16&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft&amp;diff=253313</id>
		<title>O-Saft</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft&amp;diff=253313"/>
				<updated>2019-07-27T20:19:31Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&amp;lt;!-- see also: https://www.owasp.org/index.php/OWASP_Documentation_Project_Template --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position:absolute;top:-5555px&amp;quot;&amp;gt;O-Saft - check for SSL connection, certificate and ciphers(this text to make crawlers happy;-)&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;!-- previous line cannot be H1 tag because headertab extension would break the page layout then :-( --&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:90px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File: lab_big.jpg|link=OWASP_Project_Stages#tab.3DLab_Projects]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
==O-Saft==&lt;br /&gt;
;OWASP SSL advanced forensic tool / OWASP SSL audit for testers &lt;br /&gt;
&lt;br /&gt;
O-Saft is an easy to use tool to show informations about SSL certificate and tests the SSL connection according given list of ciphers and various SSL configurations.&lt;br /&gt;
&lt;br /&gt;
It's designed to be used by penetration testers, security auditors or server administrators. The idea is to show the important informations or the special checks with a simple call of the tool. However, it provides a wide range of options so that it can be used for comprehensive and special checks by experienced people.&lt;br /&gt;
&lt;br /&gt;
O-Saft is a command-line tool, so it can be used offline and in closed environments. There is also a GUI based on Tcl/Tk. However, it can simply be turned into an online CGI-tool (please read documentation first).&lt;br /&gt;
&lt;br /&gt;
====Introduction====&lt;br /&gt;
;Quick Installation:&lt;br /&gt;
* Download and unpack ''o-saft.tgz'' (Stable Release)&lt;br /&gt;
* to run ''o-saft'': Ensure that following perl modules (and their dependencies) are installed&lt;br /&gt;
: &amp;lt;nowiki&amp;gt;&amp;amp;#160; &amp;amp;#160; &amp;amp;#160;&amp;lt;/nowiki&amp;gt; ''IO::Socket::INET'', ''IO::Socket::SSL'', ''Net::SSLeay''&lt;br /&gt;
: &amp;lt;nowiki&amp;gt;&amp;amp;#160; &amp;amp;#160; &amp;amp;#160;&amp;lt;/nowiki&amp;gt; ''Net::SSLinfo'', ''Net::SSLhello'' (which are part of the tarball)&lt;br /&gt;
* read and (re-)move ''o-saft-README''&lt;br /&gt;
* Show help&lt;br /&gt;
: ''o-saft --help=commands''&lt;br /&gt;
: ''o-saft --help''&lt;br /&gt;
* Start&lt;br /&gt;
: ''o-saft +info  your.tld''&lt;br /&gt;
: ''o-saft +check your.tld''&lt;br /&gt;
: ''o-saft +quick your.tld''&lt;br /&gt;
: ''o-saft +cipherall your.tld''&lt;br /&gt;
: ''o-saft +cipherall --starttls=pop3 pop3.your.tld:110''&lt;br /&gt;
: ''o-saft +info mail.tld:25 --starttls''&lt;br /&gt;
* to run the optional ''checkAllCiphers'' (tiny program to check solely ciphers, like command '+cipherall'): It usually does not need any perl module to be additionally installed&lt;br /&gt;
: &amp;lt;nowiki&amp;gt;&amp;amp;#160; &amp;amp;#160; &amp;amp;#160;&amp;lt;/nowiki&amp;gt; ''Socket'' (should be part of your perl installation)&lt;br /&gt;
: &amp;lt;nowiki&amp;gt;&amp;amp;#160; &amp;amp;#160; &amp;amp;#160;&amp;lt;/nowiki&amp;gt; ''Net::SSLhello'' (which is part of the tarball)&lt;br /&gt;
: &amp;lt;nowiki&amp;gt;&amp;amp;#160; &amp;amp;#160; &amp;amp;#160;&amp;lt;/nowiki&amp;gt; ''NET::DNS'' (only needed, if option '--mx' is used) &lt;br /&gt;
* Start&lt;br /&gt;
: ''checkAllCiphers your.tld''&lt;br /&gt;
: ''checkAllCiphers --starttls=pop3 pop3.your.tld:110''&lt;br /&gt;
: ''checkAllCiphers --mx your.tld:25 --starttls=smtp''&lt;br /&gt;
* Simple GUI&lt;br /&gt;
: ''o-saft.tcl''&lt;br /&gt;
: ''o-saft.tcl your.tld''&lt;br /&gt;
&lt;br /&gt;
* Kali 2019&lt;br /&gt;
: ''apt install o-saft'' # installs version 19.01.19&lt;br /&gt;
: ''apt install libidn11-dev libidn2-0-dev libzip-dev libsctp-dev libkrb5-dev''&lt;br /&gt;
: ''cd /usr/share/o-saft''&lt;br /&gt;
: # get updated script&lt;br /&gt;
: ''curl -O contrib/install_openssl.sh https://raw.githubusercontent.com/OWASP/O-Saft/master/contrib/install_openssl.sh''&lt;br /&gt;
: ''sh contrib/install_openssl.sh --m''&lt;br /&gt;
: # enjoy commands as described before ...&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
&lt;br /&gt;
The main idea is to have a tool which works on common platforms and can simply be automated.&lt;br /&gt;
;In a Nutshell:&lt;br /&gt;
:* show SSL connection details&lt;br /&gt;
:* show certificate details&lt;br /&gt;
:* check for supported ciphers&lt;br /&gt;
:* check for ciphers provided in your own libssl.so and libcrypt.so&lt;br /&gt;
:* check for ciphers without any dependency to a library (+cipherall)&lt;br /&gt;
:* checks the server's priority for ciphers (+cipherall) &lt;br /&gt;
:* check for special HTTP(S) support (like SNI, HSTS, certificate pinning, SSTP)&lt;br /&gt;
:* check for vulnerabilities (BEAST, CRIME, DROWN, FREAK, Heartbleed, Lucky 13, POODLE, RC4 Bias, Sweet32 ...)&lt;br /&gt;
:* check the length of Diffie Hellman Parameters by the cipher (+cipherall needs option '--experimental')&lt;br /&gt;
:* may check for a single attribute&lt;br /&gt;
:* may check multiple targets at once&lt;br /&gt;
:* can be scripted (headless or as CGI)&lt;br /&gt;
:* should work on any platform (just needs perl, openssl optional)&lt;br /&gt;
:* can be used in CI / CD environments&lt;br /&gt;
:* output format can be customized&lt;br /&gt;
:* various trace and debug options to hunt unusual connection problems&lt;br /&gt;
:* supports STARTTLS for various protocols like (SMTP, POP3, IMAP, LDAP, RDP, XMPP, IRC (experimental) ...),[without options using openssl]&amp;lt;br&amp;gt;&amp;amp;nbsp; slows down to prevent blockades of requests due to too much connections (supported for some protocols like SMTP)&lt;br /&gt;
:* Proxy is supported (besides commands using openssl)&lt;br /&gt;
:* check of STARTTLS/SMTP for all servers of a MX Resource Record (e.g. ''checkAllCiphers --mx your.tld:25 --starttls=smtp'')&lt;br /&gt;
:* checkAllCiphers.pl and '+cipherall' support DTLS for '--experimental' use (if records are *not* fragmented)&lt;br /&gt;
&lt;br /&gt;
==New Features of Test Version==&lt;br /&gt;
;Quick Installation (test version):&lt;br /&gt;
* Download and unpack: ''master.zip''&lt;br /&gt;
* Start ''INSTALL.sh'' (if you want:)&lt;br /&gt;
* Enjoy new functionality:&lt;br /&gt;
:* --starttls='CUSTOM' to customize your own STARTTLS sequence including error handling, see help for '--starttls_phase1..5' and '--starttls_error1..3'&lt;br /&gt;
:* '+cipherraw' and 'checkAllCiphers.pl' changed bahavior to check sni (now the default is to use solely sni &amp;gt;=tls1,&amp;lt;br&amp;gt;new option --togglesni tests without and with sni in one call&lt;br /&gt;
:* checkAllCiphers.pl/+cipherall: shows the length of dh_parameter for ciphers with DHE and DH_anon, shows the elliptic curve that the server prefers for ECDHE (independant from openssl)&lt;br /&gt;
:* checkAllCiphers.pl/+cipherall: support of fagmented messages reassembling SSL/TLS-records&lt;br /&gt;
* please give us feedback via the [https://lists.owasp.org/mailman/listinfo/o-saft mailinglist]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;padding-left:25px;width:200px;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== What is O-Saft? ==&lt;br /&gt;
&lt;br /&gt;
O-Saft  provides:&lt;br /&gt;
&lt;br /&gt;
* SSL connection details&lt;br /&gt;
* certificate details&lt;br /&gt;
* full cipher check&lt;br /&gt;
* special HTTP(s) checks&lt;br /&gt;
* check for SSL vulnerabilities&lt;br /&gt;
* can be scripted&lt;br /&gt;
* platfrom independent&lt;br /&gt;
* customizable output&lt;br /&gt;
* supports STARTTLS and Proxy (for most commands)&lt;br /&gt;
&lt;br /&gt;
== Screen Shots ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- code stolen from generated page and improved 9/2016&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbcaption&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;magnify&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/index.php/File:O-Saft_cipherCLI.png&amp;quot; class=&amp;quot;internal&amp;quot; title=&amp;quot;Enlarge&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;/File:O-Saft_cipherCLI.png&amp;quot; width=&amp;quot;15&amp;quot; height=&amp;quot;11&amp;quot; alt=&amp;quot;O-Saft +cipher ...&amp;quot; /&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;O-Saft +cipher ...&amp;lt;/div&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- original wiki code 9/2016&lt;br /&gt;
[[Image:O-Saft cipherCLI.png|thumb|300px|right|O-Saft +cipher ]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
* [[O-Saft/Documentation | help/man page]]&lt;br /&gt;
&lt;br /&gt;
== Presentations ==&lt;br /&gt;
* 03.04.2017 O-Saft Workshop at &amp;lt;u&amp;gt;[[https://sites.google.com/view/bsidesmunich2017 BSides Munich 2017]]&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Workshop &amp;lt;u&amp;gt;[http://www.it-security-konferenz.de/programm.html#workshop3|3. Kölner IT-Security-Konferenz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* 17.03.2016  &amp;lt;u&amp;gt;[[BeNeLux_OWASP_Day_2016|OWASP BeNeLux Day 2016]]&amp;lt;/u&amp;gt;, Luxembourg&lt;br /&gt;
: There will be a training &amp;lt;u&amp;gt;[[BeNeLux_OWASP_Day_2016#Trainingday|O-Saft - TLS/SSL in Practice]]&amp;lt;/u&amp;gt;.&lt;br /&gt;
* 20.05.2015 &amp;lt;u&amp;gt;[https://2015.appsec.eu/ AppSecEU 2015]&amp;lt;/u&amp;gt;, Amsterdam&lt;br /&gt;
: There will be a training &amp;lt;u&amp;gt;[http://2015.appsec.eu/trainings/#train4 TLS/SSL in Practice]&amp;lt;/u&amp;gt; which in particular covers O-Saft.&lt;br /&gt;
&amp;lt;!-- wenn wir eine bessere Beschreibung brauchen:&lt;br /&gt;
     http://appseceurope2014.sched.org/event/0e316b9ea5c28375dcc8fd41baedd481&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* 09.12.2014 Presentation '' Richtig verschlüsseln mit SSL/TLS'' at &amp;lt;u&amp;gt;[[German_OWASP_Day_2014|German OWASP Day 2014]]&amp;lt;/u&amp;gt;, program see &amp;lt;u&amp;gt;[[German_OWASP_Day_2014/Programm|here]]&amp;lt;/u&amp;gt;&lt;br /&gt;
* &amp;lt;u&amp;gt;[https://2014.appsec.eu/ AppSecEU 2014]&amp;lt;/u&amp;gt;, Cambridge&lt;br /&gt;
: There will be a training &amp;lt;u&amp;gt;[http://appseceurope2014.sched.org/event/0e316b9ea5c28375dcc8fd41baedd481 TLS/SSL in Practice]&amp;lt;/u&amp;gt; which in particular covers O-Saft. For &amp;lt;u&amp;gt;[http://appseceurope2014.sched.org/ schedule see here]&amp;lt;/u&amp;gt;.&lt;br /&gt;
* Vortrag beim German OWASP Day 2014: &amp;lt;u&amp;gt;[[Media:Richtig_verschluesseln_mit_SSL+TLS_-_Achim_Hoffmann+Torsten_Gigler.pdf|Richtig verschlüsseln mit SSL/TLS]]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Vortrag beim Münchner OWASP-Stammtisch: &amp;lt;u&amp;gt;[[Media:SSL-in-der-Praxis_OWASP-Stammtisch-Muenchen.pdf‎|Überblick über aktuelle Angriffsmöglichkeiten auf HTTPS / SSL]]&amp;lt;/u&amp;gt; (enthält auch ein paar Beispiele mit o-saft)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;(These presentations are in German)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
&lt;br /&gt;
[[User:Achim|Achim]] Hoffmann&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
OWASP O-Saft is free to use. It is licensed under the GPL v2 license.&lt;br /&gt;
&lt;br /&gt;
== Related Projects ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- * [[OWASP_CISO_Survey]] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Github ==&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;u&amp;gt;https://github.com/OWASP/O-Saft&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ohloh ==&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;u&amp;gt;https://www.ohloh.net/p/O-Saft&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;padding-left:25px;width:200px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== Quick Download ==&lt;br /&gt;
* '''Stable Release (19.01.19)''': &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/19.01.19.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* more see  [[#Change Log]]&lt;br /&gt;
&lt;br /&gt;
== Docker ==&lt;br /&gt;
A Docker Container can be found at &amp;lt;u&amp;gt;https://hub.docker.com/r/owasp/o-saft/&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
* [2019] O-Saft is available as package in '''Kali 2019'''&lt;br /&gt;
* [12. - 16.06.17] &amp;lt;u&amp;gt;[[https://owaspsummit.org/Working-Sessions/Owasp-Projects/O-Saft.html O-Saft Track]]&amp;lt;/u&amp;gt; (at OWASP Summit, London)&lt;br /&gt;
* '''2013 Top Security Tools'''&lt;br /&gt;
:thanks for voting &amp;lt;u&amp;gt;[http://www.toolswatch.org/2013/12/2013-top-security-tools-as-voted-by-toolswatch-org-readers/ O-Saft as #10 best security tools 2013 ]&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== In Print / Media ==&lt;br /&gt;
Find a OWASP 24/7 podcast about the tool [http://trustedsoftwarealliance.com/2014/07/01/achim-hoffman-and-the-o-saft-project-for-scanning-ssl-connections/ here].&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;200&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; rowspan=&amp;quot;2&amp;quot;| [[Image:Owasp-labs-trans-85.png|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Lab_Projects]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot;| [[File:Owasp-builders-small.png|link=]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot;| [[File:Owasp-defenders-small.png|link=]]&lt;br /&gt;
   |-&lt;br /&gt;
   | colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot;  | [[File:Cc-button-y-sa-small.png|link=http://creativecommons.org/licenses/by-sa/3.0/]]&lt;br /&gt;
   |-&lt;br /&gt;
   | colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot;  | [[File:Project_Type_Files_TOOL.jpg|link=]]&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
;FAQs &amp;lt;!-- workaround bug in headertabs--&amp;gt;&lt;br /&gt;
* Where can I get missing Perl-Modules?&amp;lt;br&amp;gt;This depends on your OS and Perl installation, but just try ''cpan &amp;lt;Module-Name&amp;gt;'', e.g. ''cpan Net:DNS''&lt;br /&gt;
:* I am connected to the internet via a Proxy&amp;lt;br&amp;gt;open the cpan-shell using 'cpan' and configure your proxy settings: 'o conf init /proxy/' &lt;br /&gt;
:* I can not download the requested files (the proxy needs authentication)&amp;lt;br&amp;gt;run 'cpan &amp;lt;Module-Name&amp;gt;' several times, read the error messages and copy the requested files manually to the paths (without any additional temporary extension of the name),&amp;lt;br&amp;gt;e.g. &amp;lt;nowiki&amp;gt;http://www.cpan.org/authors/01mailrc.txt.gz&amp;lt;/nowiki&amp;gt; =&amp;gt; &amp;lt;Your Program Path&amp;gt;/cpan/sources/authors/01mailrc.txt.gz&lt;br /&gt;
&lt;br /&gt;
* I get the Error &amp;quot;invalid SSL_version specified at .../perl/vendor/lib/IO/Socket/SSL.pm line ...&amp;quot;&lt;br /&gt;
:* add options ''--notlsv13 --nodtlsv1'', e.g. ''perl o-saft.pl +info your.tld --notlsv13 --nodtlsv1''&lt;br /&gt;
:* use ''+cipherall'' to check the ciphers for all protocols&lt;br /&gt;
&lt;br /&gt;
* My local SSL libraries do *not* support legacy Protocols like SSLv2, SSLv3 or legacy Ciphers&lt;br /&gt;
:* use ''o-saft.pl'' for all protocols that are supported by your local computer&lt;br /&gt;
:* use ''o-saft.pl +cipherall'' (or 'checkAllCiphers.pl') to get the ciphers for the missing protocols, or recompile 'Net::SSLeay' and/or ''openssl'' to support more protocols and ciphers, see [[O-Saft/Documentation#INSTALLATION|Documentation INSTALLATION]] for details&lt;br /&gt;
&lt;br /&gt;
* I can not use the latest features of the test (experimental) version&lt;br /&gt;
:* Please verify that you downloaded and unpacked the [https://github.com/OWASP/O-Saft/archive/master.zip 'master.zip'-Archive]&lt;br /&gt;
:* some new functions are protected by the option ''--experimental'', please add it to your command (and take care what happens)&lt;br /&gt;
&lt;br /&gt;
* o-saft.pl seems to hang&lt;br /&gt;
: try one or all of following options (see [[O-Saft/Documentation#Performance_Problems|Documentation Performance Problems]]);&lt;br /&gt;
:* ''--no-dns'' ''-no-http'' ''--no-cert'' ''--no-sni'' ''--no-openssl''&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
;Acknowledgements &amp;lt;!-- workaround bug in headertabs--&amp;gt;&lt;br /&gt;
==Volunteers==&lt;br /&gt;
O-Saft is developed by &amp;lt;!--a worldwide team of volunteers--&amp;gt; from the contributions of OWASP members. The primary contributors to date have been:&lt;br /&gt;
* {{Template:Contact | name = Torsten Gigler | email =torsten.gigler@owasp.org | username = T.Gigler}}&lt;br /&gt;
&lt;br /&gt;
==Repository==&lt;br /&gt;
O-Saft's source code can be found at https://github.com/OWASP/O-Saft .&lt;br /&gt;
&lt;br /&gt;
The latest stable tarball is https://github.com/OWASP/O-Saft/raw/master/o-saft.tgz&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
;Road Map &amp;lt;!-- workaround bug in headertabs--&amp;gt;&lt;br /&gt;
https://www.owasp.org/index.php/Projects/O-Saft/Roadmap&lt;br /&gt;
&lt;br /&gt;
;Involvement in the development and promotion of O-Saft is actively encouraged!&lt;br /&gt;
You do not have to be a security expert in order to contribute.&lt;br /&gt;
Contacts:&lt;br /&gt;
* mailto: Achim at owasp dot org&lt;br /&gt;
* [https://lists.owasp.org/mailman/listinfo/o-saft Mailinglist]&lt;br /&gt;
Some of the ways you can help:&lt;br /&gt;
* Quality assurance: simply test O-Saft and report defects and strange responses of servers&lt;br /&gt;
* Give some ideas how to implement scoring&lt;br /&gt;
* Need help in implementing &lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:* SSL for other protocols using STARTTLS, ...&amp;lt;br&amp;gt;(currently, February 2015, we have STARTTLS functionality for LDAP, IMAP, POP3, SMTP, RDP, FTP, XMPP,...) --&amp;gt;&lt;br /&gt;
:* authentication for proxies (BASIC, NTLM)&lt;br /&gt;
&amp;lt;!-- done 12/2015&lt;br /&gt;
:* to check the size of Diffie Hellmann Parameters --&amp;gt;&lt;br /&gt;
:* check for more SSL/TLS-Extensions (including obsolete ones) &lt;br /&gt;
:* check for more vulnerabilities&lt;br /&gt;
:* check the full certificate chain&lt;br /&gt;
&amp;lt;!-- don't include legacy project template, just for information here&lt;br /&gt;
=Project About=&lt;br /&gt;
{{:Projects/O-Saft}}} &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Change Log=&lt;br /&gt;
==Change Log==&lt;br /&gt;
* 19.01.2019  Stable Release '''19.01.19''';&lt;br /&gt;
* 18.11.2018  Stable Release '''18.11.18''';&lt;br /&gt;
* 18.07.2018  Stable Release '''18.07.18'''; bugfixes, GUI improved, docker improved, OCSP Stapling, Makefile*, contrib/build_openssl.sh&lt;br /&gt;
* 16.04.2018 Link Docker Container (pinkstar removed) as docker is supported directly&lt;br /&gt;
&amp;lt;!-- Docker Containeris available at &amp;lt;u&amp;gt;https://hub.docker.com/r/punkstar/o-saft/&amp;lt;/u&amp;gt;, thanks to punkstar. outdated --&amp;gt;&lt;br /&gt;
* 18.01.2018 Docker improved; +sni checks improved; wrapper script o-saft; +robot&lt;br /&gt;
* 17.11.2017 Dockerfile improved; +cipherall improved; bugfix: no prefered cipher for SSLv2; bit-length for serial number corrected&lt;br /&gt;
* 17.09.2017 docker build openssl with GOST and KRB5 ciphers; bugfix for BEAST and sub-domain checks&lt;br /&gt;
* 17.07.2017 docker image supported; performance improved; support unresponsive targets&lt;br /&gt;
* 17.04.2017 ALPN and NPN support improved&lt;br /&gt;
* 17.01.2017 checking OCSP improved; certificate verification corrected; performance improved&lt;br /&gt;
* 09.09.2016 GUI improved&lt;br /&gt;
* 30.08.2016 Check for new vulnerabilities '''DROWN'''&lt;br /&gt;
* 30.08.2016 Check for new vulnerabilities '''Sweet32'''&lt;br /&gt;
* 16.07.2016 new commands (checks) for STS preload, HSTS preload HSTS http-equiv&lt;br /&gt;
* 16.05.2016 code quality improved using perlcritic&lt;br /&gt;
&amp;lt;!-- not yet ready to announce&lt;br /&gt;
* 07.01.2016  simple '''check for SLOTH''' added (experimental)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* 15.12.2015  Stable Release '''15.12.15'''&lt;br /&gt;
* 15.11.2015  Stable Release '''15.11.15'''&lt;br /&gt;
* 08.01.2015, stable release '''15.01.07'''&lt;br /&gt;
* 05.04.2015, '''simple GUI''' available &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/blob/master/o-saft.tcl o-saft.tcl]&amp;lt;/u&amp;gt;&lt;br /&gt;
* 07.12.2014, stable release '''14.12.07'''&lt;br /&gt;
* 16.11.2014, stable release '''14.11.14'''&lt;br /&gt;
* 15.10.2014, check for '''Poodle''' vulnerability, see test version: &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/master.zip master.zip]&amp;lt;/u&amp;gt;&lt;br /&gt;
* 10.04.2014 Heartbleed check, see &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft https://github.com/OWASP/O-Saft]&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
* Stable Release (18.07.18): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/18.07.18.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Stable Release (18.01.18): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/18.01.18.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Stable Release (17.11.17): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/17.11.17.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Stable Release (17.06.17): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/17.06.17.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Stable Release (17.05.17): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/17.05.17.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Stable Release (17.04.17): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/17.04.17.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Stable Release (17.03.17): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/17.03.17.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Stable Release (16.12.16): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/16.12.16.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Stable Release (16.11.16): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/16.11.16.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Stable Release (16.09.16): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/16.09.16.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Stable Release (15.12.15): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/15.12.15.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]]  [[Category:OWASP_Tool]] [[Category:SSL]]  [[Category:Test]]&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft&amp;diff=253312</id>
		<title>O-Saft</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft&amp;diff=253312"/>
				<updated>2019-07-27T20:06:51Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* Introduction */ Kali 2019&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&amp;lt;!-- see also: https://www.owasp.org/index.php/OWASP_Documentation_Project_Template --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position:absolute;top:-5555px&amp;quot;&amp;gt;O-Saft - check for SSL connection, certificate and ciphers(this text to make crawlers happy;-)&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;!-- previous line cannot be H1 tag because headertab extension would break the page layout then :-( --&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:90px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File: lab_big.jpg|link=OWASP_Project_Stages#tab.3DLab_Projects]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
==O-Saft==&lt;br /&gt;
;OWASP SSL advanced forensic tool / OWASP SSL audit for testers &lt;br /&gt;
&lt;br /&gt;
O-Saft is an easy to use tool to show informations about SSL certificate and tests the SSL connection according given list of ciphers and various SSL configurations.&lt;br /&gt;
&lt;br /&gt;
It's designed to be used by penetration testers, security auditors or server administrators. The idea is to show the important informations or the special checks with a simple call of the tool. However, it provides a wide range of options so that it can be used for comprehensive and special checks by experienced people.&lt;br /&gt;
&lt;br /&gt;
O-Saft is a command-line tool, so it can be used offline and in closed environments. There is also a GUI based on Tcl/Tk. However, it can simply be turned into an online CGI-tool (please read documentation first).&lt;br /&gt;
&lt;br /&gt;
====Introduction====&lt;br /&gt;
;Quick Installation:&lt;br /&gt;
* Download and unpack ''o-saft.tgz'' (Stable Release)&lt;br /&gt;
* to run ''o-saft'': Ensure that following perl modules (and their dependencies) are installed&lt;br /&gt;
: &amp;lt;nowiki&amp;gt;&amp;amp;#160; &amp;amp;#160; &amp;amp;#160;&amp;lt;/nowiki&amp;gt; ''IO::Socket::INET'', ''IO::Socket::SSL'', ''Net::SSLeay''&lt;br /&gt;
: &amp;lt;nowiki&amp;gt;&amp;amp;#160; &amp;amp;#160; &amp;amp;#160;&amp;lt;/nowiki&amp;gt; ''Net::SSLinfo'', ''Net::SSLhello'' (which are part of the tarball)&lt;br /&gt;
* read and (re-)move ''o-saft-README''&lt;br /&gt;
* Show help&lt;br /&gt;
: ''o-saft --help=commands''&lt;br /&gt;
: ''o-saft --help''&lt;br /&gt;
* Start&lt;br /&gt;
: ''o-saft +info  your.tld''&lt;br /&gt;
: ''o-saft +check your.tld''&lt;br /&gt;
: ''o-saft +quick your.tld''&lt;br /&gt;
: ''o-saft +cipherall your.tld''&lt;br /&gt;
: ''o-saft +cipherall --starttls=pop3 pop3.your.tld:110''&lt;br /&gt;
: ''o-saft +info mail.tld:25 --starttls''&lt;br /&gt;
* to run the optional ''checkAllCiphers'' (tiny program to check solely ciphers, like command '+cipherall'): It usually does not need any perl module to be additionally installed&lt;br /&gt;
: &amp;lt;nowiki&amp;gt;&amp;amp;#160; &amp;amp;#160; &amp;amp;#160;&amp;lt;/nowiki&amp;gt; ''Socket'' (should be part of your perl installation)&lt;br /&gt;
: &amp;lt;nowiki&amp;gt;&amp;amp;#160; &amp;amp;#160; &amp;amp;#160;&amp;lt;/nowiki&amp;gt; ''Net::SSLhello'' (which is part of the tarball)&lt;br /&gt;
: &amp;lt;nowiki&amp;gt;&amp;amp;#160; &amp;amp;#160; &amp;amp;#160;&amp;lt;/nowiki&amp;gt; ''NET::DNS'' (only needed, if option '--mx' is used) &lt;br /&gt;
* Start&lt;br /&gt;
: ''checkAllCiphers your.tld''&lt;br /&gt;
: ''checkAllCiphers --starttls=pop3 pop3.your.tld:110''&lt;br /&gt;
: ''checkAllCiphers --mx your.tld:25 --starttls=smtp''&lt;br /&gt;
* Simple GUI&lt;br /&gt;
: ''o-saft.tcl''&lt;br /&gt;
: ''o-saft.tcl your.tld''&lt;br /&gt;
&lt;br /&gt;
* Kali 2019&lt;br /&gt;
: ''apt install o-saft'' # installs version 19.01.19&lt;br /&gt;
: ''apt install libidn11-dev libidn2-0-dev libzip-dev libsctp-dev libkrb5-dev''&lt;br /&gt;
: ''cd /usr/share/o-saft &amp;amp;&amp;amp; contrib/install_openssl.sh --m''&lt;br /&gt;
: # enjoy commands as described before ...&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
&lt;br /&gt;
The main idea is to have a tool which works on common platforms and can simply be automated.&lt;br /&gt;
;In a Nutshell:&lt;br /&gt;
:* show SSL connection details&lt;br /&gt;
:* show certificate details&lt;br /&gt;
:* check for supported ciphers&lt;br /&gt;
:* check for ciphers provided in your own libssl.so and libcrypt.so&lt;br /&gt;
:* check for ciphers without any dependency to a library (+cipherall)&lt;br /&gt;
:* checks the server's priority for ciphers (+cipherall) &lt;br /&gt;
:* check for special HTTP(S) support (like SNI, HSTS, certificate pinning, SSTP)&lt;br /&gt;
:* check for vulnerabilities (BEAST, CRIME, DROWN, FREAK, Heartbleed, Lucky 13, POODLE, RC4 Bias, Sweet32 ...)&lt;br /&gt;
:* check the length of Diffie Hellman Parameters by the cipher (+cipherall needs option '--experimental')&lt;br /&gt;
:* may check for a single attribute&lt;br /&gt;
:* may check multiple targets at once&lt;br /&gt;
:* can be scripted (headless or as CGI)&lt;br /&gt;
:* should work on any platform (just needs perl, openssl optional)&lt;br /&gt;
:* can be used in CI / CD environments&lt;br /&gt;
:* output format can be customized&lt;br /&gt;
:* various trace and debug options to hunt unusual connection problems&lt;br /&gt;
:* supports STARTTLS for various protocols like (SMTP, POP3, IMAP, LDAP, RDP, XMPP, IRC (experimental) ...),[without options using openssl]&amp;lt;br&amp;gt;&amp;amp;nbsp; slows down to prevent blockades of requests due to too much connections (supported for some protocols like SMTP)&lt;br /&gt;
:* Proxy is supported (besides commands using openssl)&lt;br /&gt;
:* check of STARTTLS/SMTP for all servers of a MX Resource Record (e.g. ''checkAllCiphers --mx your.tld:25 --starttls=smtp'')&lt;br /&gt;
:* checkAllCiphers.pl and '+cipherall' support DTLS for '--experimental' use (if records are *not* fragmented)&lt;br /&gt;
&lt;br /&gt;
==New Features of Test Version==&lt;br /&gt;
;Quick Installation (test version):&lt;br /&gt;
* Download and unpack: ''master.zip''&lt;br /&gt;
* Start ''INSTALL.sh'' (if you want:)&lt;br /&gt;
* Enjoy new functionality:&lt;br /&gt;
:* --starttls='CUSTOM' to customize your own STARTTLS sequence including error handling, see help for '--starttls_phase1..5' and '--starttls_error1..3'&lt;br /&gt;
:* '+cipherraw' and 'checkAllCiphers.pl' changed bahavior to check sni (now the default is to use solely sni &amp;gt;=tls1,&amp;lt;br&amp;gt;new option --togglesni tests without and with sni in one call&lt;br /&gt;
:* checkAllCiphers.pl/+cipherall: shows the length of dh_parameter for ciphers with DHE and DH_anon, shows the elliptic curve that the server prefers for ECDHE (independant from openssl)&lt;br /&gt;
:* checkAllCiphers.pl/+cipherall: support of fagmented messages reassembling SSL/TLS-records&lt;br /&gt;
* please give us feedback via the [https://lists.owasp.org/mailman/listinfo/o-saft mailinglist]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;padding-left:25px;width:200px;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== What is O-Saft? ==&lt;br /&gt;
&lt;br /&gt;
O-Saft  provides:&lt;br /&gt;
&lt;br /&gt;
* SSL connection details&lt;br /&gt;
* certificate details&lt;br /&gt;
* full cipher check&lt;br /&gt;
* special HTTP(s) checks&lt;br /&gt;
* check for SSL vulnerabilities&lt;br /&gt;
* can be scripted&lt;br /&gt;
* platfrom independent&lt;br /&gt;
* customizable output&lt;br /&gt;
* supports STARTTLS and Proxy (for most commands)&lt;br /&gt;
&lt;br /&gt;
== Screen Shots ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- code stolen from generated page and improved 9/2016&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbcaption&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;magnify&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/index.php/File:O-Saft_cipherCLI.png&amp;quot; class=&amp;quot;internal&amp;quot; title=&amp;quot;Enlarge&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;/File:O-Saft_cipherCLI.png&amp;quot; width=&amp;quot;15&amp;quot; height=&amp;quot;11&amp;quot; alt=&amp;quot;O-Saft +cipher ...&amp;quot; /&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;O-Saft +cipher ...&amp;lt;/div&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- original wiki code 9/2016&lt;br /&gt;
[[Image:O-Saft cipherCLI.png|thumb|300px|right|O-Saft +cipher ]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
* [[O-Saft/Documentation | help/man page]]&lt;br /&gt;
&lt;br /&gt;
== Presentations ==&lt;br /&gt;
* 03.04.2017 O-Saft Workshop at &amp;lt;u&amp;gt;[[https://sites.google.com/view/bsidesmunich2017 BSides Munich 2017]]&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Workshop &amp;lt;u&amp;gt;[http://www.it-security-konferenz.de/programm.html#workshop3|3. Kölner IT-Security-Konferenz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* 17.03.2016  &amp;lt;u&amp;gt;[[BeNeLux_OWASP_Day_2016|OWASP BeNeLux Day 2016]]&amp;lt;/u&amp;gt;, Luxembourg&lt;br /&gt;
: There will be a training &amp;lt;u&amp;gt;[[BeNeLux_OWASP_Day_2016#Trainingday|O-Saft - TLS/SSL in Practice]]&amp;lt;/u&amp;gt;.&lt;br /&gt;
* 20.05.2015 &amp;lt;u&amp;gt;[https://2015.appsec.eu/ AppSecEU 2015]&amp;lt;/u&amp;gt;, Amsterdam&lt;br /&gt;
: There will be a training &amp;lt;u&amp;gt;[http://2015.appsec.eu/trainings/#train4 TLS/SSL in Practice]&amp;lt;/u&amp;gt; which in particular covers O-Saft.&lt;br /&gt;
&amp;lt;!-- wenn wir eine bessere Beschreibung brauchen:&lt;br /&gt;
     http://appseceurope2014.sched.org/event/0e316b9ea5c28375dcc8fd41baedd481&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* 09.12.2014 Presentation '' Richtig verschlüsseln mit SSL/TLS'' at &amp;lt;u&amp;gt;[[German_OWASP_Day_2014|German OWASP Day 2014]]&amp;lt;/u&amp;gt;, program see &amp;lt;u&amp;gt;[[German_OWASP_Day_2014/Programm|here]]&amp;lt;/u&amp;gt;&lt;br /&gt;
* &amp;lt;u&amp;gt;[https://2014.appsec.eu/ AppSecEU 2014]&amp;lt;/u&amp;gt;, Cambridge&lt;br /&gt;
: There will be a training &amp;lt;u&amp;gt;[http://appseceurope2014.sched.org/event/0e316b9ea5c28375dcc8fd41baedd481 TLS/SSL in Practice]&amp;lt;/u&amp;gt; which in particular covers O-Saft. For &amp;lt;u&amp;gt;[http://appseceurope2014.sched.org/ schedule see here]&amp;lt;/u&amp;gt;.&lt;br /&gt;
* Vortrag beim German OWASP Day 2014: &amp;lt;u&amp;gt;[[Media:Richtig_verschluesseln_mit_SSL+TLS_-_Achim_Hoffmann+Torsten_Gigler.pdf|Richtig verschlüsseln mit SSL/TLS]]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Vortrag beim Münchner OWASP-Stammtisch: &amp;lt;u&amp;gt;[[Media:SSL-in-der-Praxis_OWASP-Stammtisch-Muenchen.pdf‎|Überblick über aktuelle Angriffsmöglichkeiten auf HTTPS / SSL]]&amp;lt;/u&amp;gt; (enthält auch ein paar Beispiele mit o-saft)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;(These presentations are in German)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
&lt;br /&gt;
[[User:Achim|Achim]] Hoffmann&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
OWASP O-Saft is free to use. It is licensed under the GPL v2 license.&lt;br /&gt;
&lt;br /&gt;
== Related Projects ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- * [[OWASP_CISO_Survey]] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Github ==&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;u&amp;gt;https://github.com/OWASP/O-Saft&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ohloh ==&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;u&amp;gt;https://www.ohloh.net/p/O-Saft&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;padding-left:25px;width:200px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== Quick Download ==&lt;br /&gt;
* '''Stable Release (19.01.19)''': &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/19.01.19.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* more see  [[#Change Log]]&lt;br /&gt;
&lt;br /&gt;
== Docker ==&lt;br /&gt;
A Docker Container can be found at &amp;lt;u&amp;gt;https://hub.docker.com/r/owasp/o-saft/&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
* [2019] O-Saft is available as package in '''Kali 2019'''&lt;br /&gt;
* [12. - 16.06.17] &amp;lt;u&amp;gt;[[https://owaspsummit.org/Working-Sessions/Owasp-Projects/O-Saft.html O-Saft Track]]&amp;lt;/u&amp;gt; (at OWASP Summit, London)&lt;br /&gt;
* '''2013 Top Security Tools'''&lt;br /&gt;
:thanks for voting &amp;lt;u&amp;gt;[http://www.toolswatch.org/2013/12/2013-top-security-tools-as-voted-by-toolswatch-org-readers/ O-Saft as #10 best security tools 2013 ]&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== In Print / Media ==&lt;br /&gt;
Find a OWASP 24/7 podcast about the tool [http://trustedsoftwarealliance.com/2014/07/01/achim-hoffman-and-the-o-saft-project-for-scanning-ssl-connections/ here].&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;200&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; rowspan=&amp;quot;2&amp;quot;| [[Image:Owasp-labs-trans-85.png|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Lab_Projects]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot;| [[File:Owasp-builders-small.png|link=]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot;| [[File:Owasp-defenders-small.png|link=]]&lt;br /&gt;
   |-&lt;br /&gt;
   | colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot;  | [[File:Cc-button-y-sa-small.png|link=http://creativecommons.org/licenses/by-sa/3.0/]]&lt;br /&gt;
   |-&lt;br /&gt;
   | colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot;  | [[File:Project_Type_Files_TOOL.jpg|link=]]&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
;FAQs &amp;lt;!-- workaround bug in headertabs--&amp;gt;&lt;br /&gt;
* Where can I get missing Perl-Modules?&amp;lt;br&amp;gt;This depends on your OS and Perl installation, but just try ''cpan &amp;lt;Module-Name&amp;gt;'', e.g. ''cpan Net:DNS''&lt;br /&gt;
:* I am connected to the internet via a Proxy&amp;lt;br&amp;gt;open the cpan-shell using 'cpan' and configure your proxy settings: 'o conf init /proxy/' &lt;br /&gt;
:* I can not download the requested files (the proxy needs authentication)&amp;lt;br&amp;gt;run 'cpan &amp;lt;Module-Name&amp;gt;' several times, read the error messages and copy the requested files manually to the paths (without any additional temporary extension of the name),&amp;lt;br&amp;gt;e.g. &amp;lt;nowiki&amp;gt;http://www.cpan.org/authors/01mailrc.txt.gz&amp;lt;/nowiki&amp;gt; =&amp;gt; &amp;lt;Your Program Path&amp;gt;/cpan/sources/authors/01mailrc.txt.gz&lt;br /&gt;
&lt;br /&gt;
* I get the Error &amp;quot;invalid SSL_version specified at .../perl/vendor/lib/IO/Socket/SSL.pm line ...&amp;quot;&lt;br /&gt;
:* add options ''--notlsv13 --nodtlsv1'', e.g. ''perl o-saft.pl +info your.tld --notlsv13 --nodtlsv1''&lt;br /&gt;
:* use ''+cipherall'' to check the ciphers for all protocols&lt;br /&gt;
&lt;br /&gt;
* My local SSL libraries do *not* support legacy Protocols like SSLv2, SSLv3 or legacy Ciphers&lt;br /&gt;
:* use ''o-saft.pl'' for all protocols that are supported by your local computer&lt;br /&gt;
:* use ''o-saft.pl +cipherall'' (or 'checkAllCiphers.pl') to get the ciphers for the missing protocols, or recompile 'Net::SSLeay' and/or ''openssl'' to support more protocols and ciphers, see [[O-Saft/Documentation#INSTALLATION|Documentation INSTALLATION]] for details&lt;br /&gt;
&lt;br /&gt;
* I can not use the latest features of the test (experimental) version&lt;br /&gt;
:* Please verify that you downloaded and unpacked the [https://github.com/OWASP/O-Saft/archive/master.zip 'master.zip'-Archive]&lt;br /&gt;
:* some new functions are protected by the option ''--experimental'', please add it to your command (and take care what happens)&lt;br /&gt;
&lt;br /&gt;
* o-saft.pl seems to hang&lt;br /&gt;
: try one or all of following options (see [[O-Saft/Documentation#Performance_Problems|Documentation Performance Problems]]);&lt;br /&gt;
:* ''--no-dns'' ''-no-http'' ''--no-cert'' ''--no-sni'' ''--no-openssl''&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
;Acknowledgements &amp;lt;!-- workaround bug in headertabs--&amp;gt;&lt;br /&gt;
==Volunteers==&lt;br /&gt;
O-Saft is developed by &amp;lt;!--a worldwide team of volunteers--&amp;gt; from the contributions of OWASP members. The primary contributors to date have been:&lt;br /&gt;
* {{Template:Contact | name = Torsten Gigler | email =torsten.gigler@owasp.org | username = T.Gigler}}&lt;br /&gt;
&lt;br /&gt;
==Repository==&lt;br /&gt;
O-Saft's source code can be found at https://github.com/OWASP/O-Saft .&lt;br /&gt;
&lt;br /&gt;
The latest stable tarball is https://github.com/OWASP/O-Saft/raw/master/o-saft.tgz&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
;Road Map &amp;lt;!-- workaround bug in headertabs--&amp;gt;&lt;br /&gt;
https://www.owasp.org/index.php/Projects/O-Saft/Roadmap&lt;br /&gt;
&lt;br /&gt;
;Involvement in the development and promotion of O-Saft is actively encouraged!&lt;br /&gt;
You do not have to be a security expert in order to contribute.&lt;br /&gt;
Contacts:&lt;br /&gt;
* mailto: Achim at owasp dot org&lt;br /&gt;
* [https://lists.owasp.org/mailman/listinfo/o-saft Mailinglist]&lt;br /&gt;
Some of the ways you can help:&lt;br /&gt;
* Quality assurance: simply test O-Saft and report defects and strange responses of servers&lt;br /&gt;
* Give some ideas how to implement scoring&lt;br /&gt;
* Need help in implementing &lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:* SSL for other protocols using STARTTLS, ...&amp;lt;br&amp;gt;(currently, February 2015, we have STARTTLS functionality for LDAP, IMAP, POP3, SMTP, RDP, FTP, XMPP,...) --&amp;gt;&lt;br /&gt;
:* authentication for proxies (BASIC, NTLM)&lt;br /&gt;
&amp;lt;!-- done 12/2015&lt;br /&gt;
:* to check the size of Diffie Hellmann Parameters --&amp;gt;&lt;br /&gt;
:* check for more SSL/TLS-Extensions (including obsolete ones) &lt;br /&gt;
:* check for more vulnerabilities&lt;br /&gt;
:* check the full certificate chain&lt;br /&gt;
&amp;lt;!-- don't include legacy project template, just for information here&lt;br /&gt;
=Project About=&lt;br /&gt;
{{:Projects/O-Saft}}} &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Change Log=&lt;br /&gt;
==Change Log==&lt;br /&gt;
* 19.01.2019  Stable Release '''19.01.19''';&lt;br /&gt;
* 18.11.2018  Stable Release '''18.11.18''';&lt;br /&gt;
* 18.07.2018  Stable Release '''18.07.18'''; bugfixes, GUI improved, docker improved, OCSP Stapling, Makefile*, contrib/build_openssl.sh&lt;br /&gt;
* 16.04.2018 Link Docker Container (pinkstar removed) as docker is supported directly&lt;br /&gt;
&amp;lt;!-- Docker Containeris available at &amp;lt;u&amp;gt;https://hub.docker.com/r/punkstar/o-saft/&amp;lt;/u&amp;gt;, thanks to punkstar. outdated --&amp;gt;&lt;br /&gt;
* 18.01.2018 Docker improved; +sni checks improved; wrapper script o-saft; +robot&lt;br /&gt;
* 17.11.2017 Dockerfile improved; +cipherall improved; bugfix: no prefered cipher for SSLv2; bit-length for serial number corrected&lt;br /&gt;
* 17.09.2017 docker build openssl with GOST and KRB5 ciphers; bugfix for BEAST and sub-domain checks&lt;br /&gt;
* 17.07.2017 docker image supported; performance improved; support unresponsive targets&lt;br /&gt;
* 17.04.2017 ALPN and NPN support improved&lt;br /&gt;
* 17.01.2017 checking OCSP improved; certificate verification corrected; performance improved&lt;br /&gt;
* 09.09.2016 GUI improved&lt;br /&gt;
* 30.08.2016 Check for new vulnerabilities '''DROWN'''&lt;br /&gt;
* 30.08.2016 Check for new vulnerabilities '''Sweet32'''&lt;br /&gt;
* 16.07.2016 new commands (checks) for STS preload, HSTS preload HSTS http-equiv&lt;br /&gt;
* 16.05.2016 code quality improved using perlcritic&lt;br /&gt;
&amp;lt;!-- not yet ready to announce&lt;br /&gt;
* 07.01.2016  simple '''check for SLOTH''' added (experimental)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* 15.12.2015  Stable Release '''15.12.15'''&lt;br /&gt;
* 15.11.2015  Stable Release '''15.11.15'''&lt;br /&gt;
* 08.01.2015, stable release '''15.01.07'''&lt;br /&gt;
* 05.04.2015, '''simple GUI''' available &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/blob/master/o-saft.tcl o-saft.tcl]&amp;lt;/u&amp;gt;&lt;br /&gt;
* 07.12.2014, stable release '''14.12.07'''&lt;br /&gt;
* 16.11.2014, stable release '''14.11.14'''&lt;br /&gt;
* 15.10.2014, check for '''Poodle''' vulnerability, see test version: &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/master.zip master.zip]&amp;lt;/u&amp;gt;&lt;br /&gt;
* 10.04.2014 Heartbleed check, see &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft https://github.com/OWASP/O-Saft]&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
* Stable Release (18.07.18): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/18.07.18.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Stable Release (18.01.18): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/18.01.18.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Stable Release (17.11.17): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/17.11.17.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Stable Release (17.06.17): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/17.06.17.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Stable Release (17.05.17): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/17.05.17.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Stable Release (17.04.17): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/17.04.17.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Stable Release (17.03.17): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/17.03.17.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Stable Release (16.12.16): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/16.12.16.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Stable Release (16.11.16): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/16.11.16.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Stable Release (16.09.16): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/16.09.16.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Stable Release (15.12.15): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/15.12.15.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]]  [[Category:OWASP_Tool]] [[Category:SSL]]  [[Category:Test]]&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft&amp;diff=253311</id>
		<title>O-Saft</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft&amp;diff=253311"/>
				<updated>2019-07-27T19:58:00Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* News and Events */ Kali 2019&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&amp;lt;!-- see also: https://www.owasp.org/index.php/OWASP_Documentation_Project_Template --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position:absolute;top:-5555px&amp;quot;&amp;gt;O-Saft - check for SSL connection, certificate and ciphers(this text to make crawlers happy;-)&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;!-- previous line cannot be H1 tag because headertab extension would break the page layout then :-( --&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:90px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File: lab_big.jpg|link=OWASP_Project_Stages#tab.3DLab_Projects]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
==O-Saft==&lt;br /&gt;
;OWASP SSL advanced forensic tool / OWASP SSL audit for testers &lt;br /&gt;
&lt;br /&gt;
O-Saft is an easy to use tool to show informations about SSL certificate and tests the SSL connection according given list of ciphers and various SSL configurations.&lt;br /&gt;
&lt;br /&gt;
It's designed to be used by penetration testers, security auditors or server administrators. The idea is to show the important informations or the special checks with a simple call of the tool. However, it provides a wide range of options so that it can be used for comprehensive and special checks by experienced people.&lt;br /&gt;
&lt;br /&gt;
O-Saft is a command-line tool, so it can be used offline and in closed environments. There is also a GUI based on Tcl/Tk. However, it can simply be turned into an online CGI-tool (please read documentation first).&lt;br /&gt;
&lt;br /&gt;
====Introduction====&lt;br /&gt;
;Quick Installation:&lt;br /&gt;
* Download and unpack ''o-saft.tgz'' (Stable Release)&lt;br /&gt;
* to run ''o-saft'': Ensure that following perl modules (and their dependencies) are installed&lt;br /&gt;
: &amp;lt;nowiki&amp;gt;&amp;amp;#160; &amp;amp;#160; &amp;amp;#160;&amp;lt;/nowiki&amp;gt; ''IO::Socket::INET'', ''IO::Socket::SSL'', ''Net::SSLeay''&lt;br /&gt;
: &amp;lt;nowiki&amp;gt;&amp;amp;#160; &amp;amp;#160; &amp;amp;#160;&amp;lt;/nowiki&amp;gt; ''Net::SSLinfo'', ''Net::SSLhello'' (which are part of the tarball)&lt;br /&gt;
* read and (re-)move ''o-saft-README''&lt;br /&gt;
* Show help&lt;br /&gt;
: ''o-saft --help=commands''&lt;br /&gt;
: ''o-saft --help''&lt;br /&gt;
* Start&lt;br /&gt;
: ''o-saft +info  your.tld''&lt;br /&gt;
: ''o-saft +check your.tld''&lt;br /&gt;
: ''o-saft +quick your.tld''&lt;br /&gt;
: ''o-saft +cipherall your.tld''&lt;br /&gt;
: ''o-saft +cipherall --starttls=pop3 pop3.your.tld:110''&lt;br /&gt;
: ''o-saft +info mail.tld:25 --starttls''&lt;br /&gt;
* to run the optional ''checkAllCiphers'' (tiny program to check solely ciphers, like command '+cipherall'): It usually does not need any perl module to be additionally installed&lt;br /&gt;
: &amp;lt;nowiki&amp;gt;&amp;amp;#160; &amp;amp;#160; &amp;amp;#160;&amp;lt;/nowiki&amp;gt; ''Socket'' (should be part of your perl installation)&lt;br /&gt;
: &amp;lt;nowiki&amp;gt;&amp;amp;#160; &amp;amp;#160; &amp;amp;#160;&amp;lt;/nowiki&amp;gt; ''Net::SSLhello'' (which is part of the tarball)&lt;br /&gt;
: &amp;lt;nowiki&amp;gt;&amp;amp;#160; &amp;amp;#160; &amp;amp;#160;&amp;lt;/nowiki&amp;gt; ''NET::DNS'' (only needed, if option '--mx' is used) &lt;br /&gt;
* Start&lt;br /&gt;
: ''checkAllCiphers your.tld''&lt;br /&gt;
: ''checkAllCiphers --starttls=pop3 pop3.your.tld:110''&lt;br /&gt;
: ''checkAllCiphers --mx your.tld:25 --starttls=smtp''&lt;br /&gt;
* Simple GUI&lt;br /&gt;
: ''o-saft.tcl''&lt;br /&gt;
: ''o-saft.tcl your.tld''&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
&lt;br /&gt;
The main idea is to have a tool which works on common platforms and can simply be automated.&lt;br /&gt;
;In a Nutshell:&lt;br /&gt;
:* show SSL connection details&lt;br /&gt;
:* show certificate details&lt;br /&gt;
:* check for supported ciphers&lt;br /&gt;
:* check for ciphers provided in your own libssl.so and libcrypt.so&lt;br /&gt;
:* check for ciphers without any dependency to a library (+cipherall)&lt;br /&gt;
:* checks the server's priority for ciphers (+cipherall) &lt;br /&gt;
:* check for special HTTP(S) support (like SNI, HSTS, certificate pinning, SSTP)&lt;br /&gt;
:* check for vulnerabilities (BEAST, CRIME, DROWN, FREAK, Heartbleed, Lucky 13, POODLE, RC4 Bias, Sweet32 ...)&lt;br /&gt;
:* check the length of Diffie Hellman Parameters by the cipher (+cipherall needs option '--experimental')&lt;br /&gt;
:* may check for a single attribute&lt;br /&gt;
:* may check multiple targets at once&lt;br /&gt;
:* can be scripted (headless or as CGI)&lt;br /&gt;
:* should work on any platform (just needs perl, openssl optional)&lt;br /&gt;
:* can be used in CI / CD environments&lt;br /&gt;
:* output format can be customized&lt;br /&gt;
:* various trace and debug options to hunt unusual connection problems&lt;br /&gt;
:* supports STARTTLS for various protocols like (SMTP, POP3, IMAP, LDAP, RDP, XMPP, IRC (experimental) ...),[without options using openssl]&amp;lt;br&amp;gt;&amp;amp;nbsp; slows down to prevent blockades of requests due to too much connections (supported for some protocols like SMTP)&lt;br /&gt;
:* Proxy is supported (besides commands using openssl)&lt;br /&gt;
:* check of STARTTLS/SMTP for all servers of a MX Resource Record (e.g. ''checkAllCiphers --mx your.tld:25 --starttls=smtp'')&lt;br /&gt;
:* checkAllCiphers.pl and '+cipherall' support DTLS for '--experimental' use (if records are *not* fragmented)&lt;br /&gt;
&lt;br /&gt;
==New Features of Test Version==&lt;br /&gt;
;Quick Installation (test version):&lt;br /&gt;
* Download and unpack: ''master.zip''&lt;br /&gt;
* Start ''INSTALL.sh'' (if you want:)&lt;br /&gt;
* Enjoy new functionality:&lt;br /&gt;
:* --starttls='CUSTOM' to customize your own STARTTLS sequence including error handling, see help for '--starttls_phase1..5' and '--starttls_error1..3'&lt;br /&gt;
:* '+cipherraw' and 'checkAllCiphers.pl' changed bahavior to check sni (now the default is to use solely sni &amp;gt;=tls1,&amp;lt;br&amp;gt;new option --togglesni tests without and with sni in one call&lt;br /&gt;
:* checkAllCiphers.pl/+cipherall: shows the length of dh_parameter for ciphers with DHE and DH_anon, shows the elliptic curve that the server prefers for ECDHE (independant from openssl)&lt;br /&gt;
:* checkAllCiphers.pl/+cipherall: support of fagmented messages reassembling SSL/TLS-records&lt;br /&gt;
* please give us feedback via the [https://lists.owasp.org/mailman/listinfo/o-saft mailinglist]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;padding-left:25px;width:200px;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== What is O-Saft? ==&lt;br /&gt;
&lt;br /&gt;
O-Saft  provides:&lt;br /&gt;
&lt;br /&gt;
* SSL connection details&lt;br /&gt;
* certificate details&lt;br /&gt;
* full cipher check&lt;br /&gt;
* special HTTP(s) checks&lt;br /&gt;
* check for SSL vulnerabilities&lt;br /&gt;
* can be scripted&lt;br /&gt;
* platfrom independent&lt;br /&gt;
* customizable output&lt;br /&gt;
* supports STARTTLS and Proxy (for most commands)&lt;br /&gt;
&lt;br /&gt;
== Screen Shots ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- code stolen from generated page and improved 9/2016&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbcaption&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;magnify&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/index.php/File:O-Saft_cipherCLI.png&amp;quot; class=&amp;quot;internal&amp;quot; title=&amp;quot;Enlarge&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;/File:O-Saft_cipherCLI.png&amp;quot; width=&amp;quot;15&amp;quot; height=&amp;quot;11&amp;quot; alt=&amp;quot;O-Saft +cipher ...&amp;quot; /&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;O-Saft +cipher ...&amp;lt;/div&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- original wiki code 9/2016&lt;br /&gt;
[[Image:O-Saft cipherCLI.png|thumb|300px|right|O-Saft +cipher ]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
* [[O-Saft/Documentation | help/man page]]&lt;br /&gt;
&lt;br /&gt;
== Presentations ==&lt;br /&gt;
* 03.04.2017 O-Saft Workshop at &amp;lt;u&amp;gt;[[https://sites.google.com/view/bsidesmunich2017 BSides Munich 2017]]&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Workshop &amp;lt;u&amp;gt;[http://www.it-security-konferenz.de/programm.html#workshop3|3. Kölner IT-Security-Konferenz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* 17.03.2016  &amp;lt;u&amp;gt;[[BeNeLux_OWASP_Day_2016|OWASP BeNeLux Day 2016]]&amp;lt;/u&amp;gt;, Luxembourg&lt;br /&gt;
: There will be a training &amp;lt;u&amp;gt;[[BeNeLux_OWASP_Day_2016#Trainingday|O-Saft - TLS/SSL in Practice]]&amp;lt;/u&amp;gt;.&lt;br /&gt;
* 20.05.2015 &amp;lt;u&amp;gt;[https://2015.appsec.eu/ AppSecEU 2015]&amp;lt;/u&amp;gt;, Amsterdam&lt;br /&gt;
: There will be a training &amp;lt;u&amp;gt;[http://2015.appsec.eu/trainings/#train4 TLS/SSL in Practice]&amp;lt;/u&amp;gt; which in particular covers O-Saft.&lt;br /&gt;
&amp;lt;!-- wenn wir eine bessere Beschreibung brauchen:&lt;br /&gt;
     http://appseceurope2014.sched.org/event/0e316b9ea5c28375dcc8fd41baedd481&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* 09.12.2014 Presentation '' Richtig verschlüsseln mit SSL/TLS'' at &amp;lt;u&amp;gt;[[German_OWASP_Day_2014|German OWASP Day 2014]]&amp;lt;/u&amp;gt;, program see &amp;lt;u&amp;gt;[[German_OWASP_Day_2014/Programm|here]]&amp;lt;/u&amp;gt;&lt;br /&gt;
* &amp;lt;u&amp;gt;[https://2014.appsec.eu/ AppSecEU 2014]&amp;lt;/u&amp;gt;, Cambridge&lt;br /&gt;
: There will be a training &amp;lt;u&amp;gt;[http://appseceurope2014.sched.org/event/0e316b9ea5c28375dcc8fd41baedd481 TLS/SSL in Practice]&amp;lt;/u&amp;gt; which in particular covers O-Saft. For &amp;lt;u&amp;gt;[http://appseceurope2014.sched.org/ schedule see here]&amp;lt;/u&amp;gt;.&lt;br /&gt;
* Vortrag beim German OWASP Day 2014: &amp;lt;u&amp;gt;[[Media:Richtig_verschluesseln_mit_SSL+TLS_-_Achim_Hoffmann+Torsten_Gigler.pdf|Richtig verschlüsseln mit SSL/TLS]]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Vortrag beim Münchner OWASP-Stammtisch: &amp;lt;u&amp;gt;[[Media:SSL-in-der-Praxis_OWASP-Stammtisch-Muenchen.pdf‎|Überblick über aktuelle Angriffsmöglichkeiten auf HTTPS / SSL]]&amp;lt;/u&amp;gt; (enthält auch ein paar Beispiele mit o-saft)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;(These presentations are in German)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
&lt;br /&gt;
[[User:Achim|Achim]] Hoffmann&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
OWASP O-Saft is free to use. It is licensed under the GPL v2 license.&lt;br /&gt;
&lt;br /&gt;
== Related Projects ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- * [[OWASP_CISO_Survey]] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Github ==&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;u&amp;gt;https://github.com/OWASP/O-Saft&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ohloh ==&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;u&amp;gt;https://www.ohloh.net/p/O-Saft&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;padding-left:25px;width:200px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== Quick Download ==&lt;br /&gt;
* '''Stable Release (19.01.19)''': &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/19.01.19.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* more see  [[#Change Log]]&lt;br /&gt;
&lt;br /&gt;
== Docker ==&lt;br /&gt;
A Docker Container can be found at &amp;lt;u&amp;gt;https://hub.docker.com/r/owasp/o-saft/&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
* [2019] O-Saft is available as package in '''Kali 2019'''&lt;br /&gt;
* [12. - 16.06.17] &amp;lt;u&amp;gt;[[https://owaspsummit.org/Working-Sessions/Owasp-Projects/O-Saft.html O-Saft Track]]&amp;lt;/u&amp;gt; (at OWASP Summit, London)&lt;br /&gt;
* '''2013 Top Security Tools'''&lt;br /&gt;
:thanks for voting &amp;lt;u&amp;gt;[http://www.toolswatch.org/2013/12/2013-top-security-tools-as-voted-by-toolswatch-org-readers/ O-Saft as #10 best security tools 2013 ]&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== In Print / Media ==&lt;br /&gt;
Find a OWASP 24/7 podcast about the tool [http://trustedsoftwarealliance.com/2014/07/01/achim-hoffman-and-the-o-saft-project-for-scanning-ssl-connections/ here].&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;200&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; rowspan=&amp;quot;2&amp;quot;| [[Image:Owasp-labs-trans-85.png|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Lab_Projects]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot;| [[File:Owasp-builders-small.png|link=]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot;| [[File:Owasp-defenders-small.png|link=]]&lt;br /&gt;
   |-&lt;br /&gt;
   | colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot;  | [[File:Cc-button-y-sa-small.png|link=http://creativecommons.org/licenses/by-sa/3.0/]]&lt;br /&gt;
   |-&lt;br /&gt;
   | colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot;  | [[File:Project_Type_Files_TOOL.jpg|link=]]&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
;FAQs &amp;lt;!-- workaround bug in headertabs--&amp;gt;&lt;br /&gt;
* Where can I get missing Perl-Modules?&amp;lt;br&amp;gt;This depends on your OS and Perl installation, but just try ''cpan &amp;lt;Module-Name&amp;gt;'', e.g. ''cpan Net:DNS''&lt;br /&gt;
:* I am connected to the internet via a Proxy&amp;lt;br&amp;gt;open the cpan-shell using 'cpan' and configure your proxy settings: 'o conf init /proxy/' &lt;br /&gt;
:* I can not download the requested files (the proxy needs authentication)&amp;lt;br&amp;gt;run 'cpan &amp;lt;Module-Name&amp;gt;' several times, read the error messages and copy the requested files manually to the paths (without any additional temporary extension of the name),&amp;lt;br&amp;gt;e.g. &amp;lt;nowiki&amp;gt;http://www.cpan.org/authors/01mailrc.txt.gz&amp;lt;/nowiki&amp;gt; =&amp;gt; &amp;lt;Your Program Path&amp;gt;/cpan/sources/authors/01mailrc.txt.gz&lt;br /&gt;
&lt;br /&gt;
* I get the Error &amp;quot;invalid SSL_version specified at .../perl/vendor/lib/IO/Socket/SSL.pm line ...&amp;quot;&lt;br /&gt;
:* add options ''--notlsv13 --nodtlsv1'', e.g. ''perl o-saft.pl +info your.tld --notlsv13 --nodtlsv1''&lt;br /&gt;
:* use ''+cipherall'' to check the ciphers for all protocols&lt;br /&gt;
&lt;br /&gt;
* My local SSL libraries do *not* support legacy Protocols like SSLv2, SSLv3 or legacy Ciphers&lt;br /&gt;
:* use ''o-saft.pl'' for all protocols that are supported by your local computer&lt;br /&gt;
:* use ''o-saft.pl +cipherall'' (or 'checkAllCiphers.pl') to get the ciphers for the missing protocols, or recompile 'Net::SSLeay' and/or ''openssl'' to support more protocols and ciphers, see [[O-Saft/Documentation#INSTALLATION|Documentation INSTALLATION]] for details&lt;br /&gt;
&lt;br /&gt;
* I can not use the latest features of the test (experimental) version&lt;br /&gt;
:* Please verify that you downloaded and unpacked the [https://github.com/OWASP/O-Saft/archive/master.zip 'master.zip'-Archive]&lt;br /&gt;
:* some new functions are protected by the option ''--experimental'', please add it to your command (and take care what happens)&lt;br /&gt;
&lt;br /&gt;
* o-saft.pl seems to hang&lt;br /&gt;
: try one or all of following options (see [[O-Saft/Documentation#Performance_Problems|Documentation Performance Problems]]);&lt;br /&gt;
:* ''--no-dns'' ''-no-http'' ''--no-cert'' ''--no-sni'' ''--no-openssl''&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
;Acknowledgements &amp;lt;!-- workaround bug in headertabs--&amp;gt;&lt;br /&gt;
==Volunteers==&lt;br /&gt;
O-Saft is developed by &amp;lt;!--a worldwide team of volunteers--&amp;gt; from the contributions of OWASP members. The primary contributors to date have been:&lt;br /&gt;
* {{Template:Contact | name = Torsten Gigler | email =torsten.gigler@owasp.org | username = T.Gigler}}&lt;br /&gt;
&lt;br /&gt;
==Repository==&lt;br /&gt;
O-Saft's source code can be found at https://github.com/OWASP/O-Saft .&lt;br /&gt;
&lt;br /&gt;
The latest stable tarball is https://github.com/OWASP/O-Saft/raw/master/o-saft.tgz&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
;Road Map &amp;lt;!-- workaround bug in headertabs--&amp;gt;&lt;br /&gt;
https://www.owasp.org/index.php/Projects/O-Saft/Roadmap&lt;br /&gt;
&lt;br /&gt;
;Involvement in the development and promotion of O-Saft is actively encouraged!&lt;br /&gt;
You do not have to be a security expert in order to contribute.&lt;br /&gt;
Contacts:&lt;br /&gt;
* mailto: Achim at owasp dot org&lt;br /&gt;
* [https://lists.owasp.org/mailman/listinfo/o-saft Mailinglist]&lt;br /&gt;
Some of the ways you can help:&lt;br /&gt;
* Quality assurance: simply test O-Saft and report defects and strange responses of servers&lt;br /&gt;
* Give some ideas how to implement scoring&lt;br /&gt;
* Need help in implementing &lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:* SSL for other protocols using STARTTLS, ...&amp;lt;br&amp;gt;(currently, February 2015, we have STARTTLS functionality for LDAP, IMAP, POP3, SMTP, RDP, FTP, XMPP,...) --&amp;gt;&lt;br /&gt;
:* authentication for proxies (BASIC, NTLM)&lt;br /&gt;
&amp;lt;!-- done 12/2015&lt;br /&gt;
:* to check the size of Diffie Hellmann Parameters --&amp;gt;&lt;br /&gt;
:* check for more SSL/TLS-Extensions (including obsolete ones) &lt;br /&gt;
:* check for more vulnerabilities&lt;br /&gt;
:* check the full certificate chain&lt;br /&gt;
&amp;lt;!-- don't include legacy project template, just for information here&lt;br /&gt;
=Project About=&lt;br /&gt;
{{:Projects/O-Saft}}} &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Change Log=&lt;br /&gt;
==Change Log==&lt;br /&gt;
* 19.01.2019  Stable Release '''19.01.19''';&lt;br /&gt;
* 18.11.2018  Stable Release '''18.11.18''';&lt;br /&gt;
* 18.07.2018  Stable Release '''18.07.18'''; bugfixes, GUI improved, docker improved, OCSP Stapling, Makefile*, contrib/build_openssl.sh&lt;br /&gt;
* 16.04.2018 Link Docker Container (pinkstar removed) as docker is supported directly&lt;br /&gt;
&amp;lt;!-- Docker Containeris available at &amp;lt;u&amp;gt;https://hub.docker.com/r/punkstar/o-saft/&amp;lt;/u&amp;gt;, thanks to punkstar. outdated --&amp;gt;&lt;br /&gt;
* 18.01.2018 Docker improved; +sni checks improved; wrapper script o-saft; +robot&lt;br /&gt;
* 17.11.2017 Dockerfile improved; +cipherall improved; bugfix: no prefered cipher for SSLv2; bit-length for serial number corrected&lt;br /&gt;
* 17.09.2017 docker build openssl with GOST and KRB5 ciphers; bugfix for BEAST and sub-domain checks&lt;br /&gt;
* 17.07.2017 docker image supported; performance improved; support unresponsive targets&lt;br /&gt;
* 17.04.2017 ALPN and NPN support improved&lt;br /&gt;
* 17.01.2017 checking OCSP improved; certificate verification corrected; performance improved&lt;br /&gt;
* 09.09.2016 GUI improved&lt;br /&gt;
* 30.08.2016 Check for new vulnerabilities '''DROWN'''&lt;br /&gt;
* 30.08.2016 Check for new vulnerabilities '''Sweet32'''&lt;br /&gt;
* 16.07.2016 new commands (checks) for STS preload, HSTS preload HSTS http-equiv&lt;br /&gt;
* 16.05.2016 code quality improved using perlcritic&lt;br /&gt;
&amp;lt;!-- not yet ready to announce&lt;br /&gt;
* 07.01.2016  simple '''check for SLOTH''' added (experimental)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* 15.12.2015  Stable Release '''15.12.15'''&lt;br /&gt;
* 15.11.2015  Stable Release '''15.11.15'''&lt;br /&gt;
* 08.01.2015, stable release '''15.01.07'''&lt;br /&gt;
* 05.04.2015, '''simple GUI''' available &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/blob/master/o-saft.tcl o-saft.tcl]&amp;lt;/u&amp;gt;&lt;br /&gt;
* 07.12.2014, stable release '''14.12.07'''&lt;br /&gt;
* 16.11.2014, stable release '''14.11.14'''&lt;br /&gt;
* 15.10.2014, check for '''Poodle''' vulnerability, see test version: &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/master.zip master.zip]&amp;lt;/u&amp;gt;&lt;br /&gt;
* 10.04.2014 Heartbleed check, see &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft https://github.com/OWASP/O-Saft]&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
* Stable Release (18.07.18): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/18.07.18.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Stable Release (18.01.18): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/18.01.18.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Stable Release (17.11.17): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/17.11.17.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Stable Release (17.06.17): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/17.06.17.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Stable Release (17.05.17): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/17.05.17.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Stable Release (17.04.17): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/17.04.17.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Stable Release (17.03.17): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/17.03.17.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Stable Release (16.12.16): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/16.12.16.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Stable Release (16.11.16): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/16.11.16.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Stable Release (16.09.16): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/16.09.16.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
* Stable Release (15.12.15): &amp;lt;u&amp;gt;[https://github.com/OWASP/O-Saft/archive/15.12.15.tar.gz o-saft.tgz]&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]]  [[Category:OWASP_Tool]] [[Category:SSL]]  [[Category:Test]]&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=253309</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=253309"/>
				<updated>2019-07-27T17:49:19Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* --exitcode-no-ciphers */ removed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:*       List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:*       Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:*       Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
&lt;br /&gt;
:Above applies to all commands except ''+cipherall'' and ''+cipherraw'' which  &lt;br /&gt;
:uses no other libraries.&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is usefull  if the certificate and the configuration must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt;    can be any string accepeted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Usefull if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:the protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptive curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these cjecks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  a-zA-Z_0-9,.\/()-  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. With  ''o-saft-docker'' and a&lt;br /&gt;
:''Dockerfile'' (both are part of the distribution), a proper Docker image&lt;br /&gt;
:will be build easily. o-saft-docker  can also be used to run commands&lt;br /&gt;
:with ''o-saft.pl'' inside the Docker image, example:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 16.09.16&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=253308</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=253308"/>
				<updated>2019-07-27T17:48:49Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* --exitcode */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:*       List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:*       Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:*       Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
&lt;br /&gt;
:Above applies to all commands except ''+cipherall'' and ''+cipherraw'' which  &lt;br /&gt;
:uses no other libraries.&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is usefull  if the certificate and the configuration must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, except if  &amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt;    can be any string accepeted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Usefull if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:the protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptive curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these cjecks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  a-zA-Z_0-9,.\/()-  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. With  ''o-saft-docker'' and a&lt;br /&gt;
:''Dockerfile'' (both are part of the distribution), a proper Docker image&lt;br /&gt;
:will be build easily. o-saft-docker  can also be used to run commands&lt;br /&gt;
:with ''o-saft.pl'' inside the Docker image, example:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 16.09.16&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=253307</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=253307"/>
				<updated>2019-07-27T17:37:08Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* --exitcode-quiet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:*       List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:*       Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:*       Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
&lt;br /&gt;
:Above applies to all commands except ''+cipherall'' and ''+cipherraw'' which  &lt;br /&gt;
:uses no other libraries.&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is usefull  if the certificate and the configuration must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end like &amp;lt;code&amp;gt;# EXIT 23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt;    can be any string accepeted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Usefull if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:the protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptive curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these cjecks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  a-zA-Z_0-9,.\/()-  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. With  ''o-saft-docker'' and a&lt;br /&gt;
:''Dockerfile'' (both are part of the distribution), a proper Docker image&lt;br /&gt;
:will be build easily. o-saft-docker  can also be used to run commands&lt;br /&gt;
:with ''o-saft.pl'' inside the Docker image, example:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 16.09.16&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=253306</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=253306"/>
				<updated>2019-07-27T17:35:57Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* --exitcode-v */ typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:*       List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:*       Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:*       Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
&lt;br /&gt;
:Above applies to all commands except ''+cipherall'' and ''+cipherraw'' which  &lt;br /&gt;
:uses no other libraries.&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is usefull  if the certificate and the configuration must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about performed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt;    can be any string accepeted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Usefull if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:the protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptive curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these cjecks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  a-zA-Z_0-9,.\/()-  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. With  ''o-saft-docker'' and a&lt;br /&gt;
:''Dockerfile'' (both are part of the distribution), a proper Docker image&lt;br /&gt;
:will be build easily. o-saft-docker  can also be used to run commands&lt;br /&gt;
:with ''o-saft.pl'' inside the Docker image, example:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 16.09.16&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=253157</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=253157"/>
				<updated>2019-07-21T10:09:02Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* Caveats */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:*       List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:*       Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:*       Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
&lt;br /&gt;
:Above applies to all commands except ''+cipherall'' and ''+cipherraw'' which  &lt;br /&gt;
:uses no other libraries.&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is usefull  if the certificate and the configuration must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about persormed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt;    can be any string accepeted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Usefull if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:the protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptive curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these cjecks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  a-zA-Z_0-9,.\/()-  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. With  ''o-saft-docker'' and a&lt;br /&gt;
:''Dockerfile'' (both are part of the distribution), a proper Docker image&lt;br /&gt;
:will be build easily. o-saft-docker  can also be used to run commands&lt;br /&gt;
:with ''o-saft.pl'' inside the Docker image, example:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(3pm)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(3pm)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 16.09.16&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=253156</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=253156"/>
				<updated>2019-07-21T10:08:11Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* --force-sni */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:*       List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:*       Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:*       Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
&lt;br /&gt;
:Above applies to all commands except ''+cipherall'' and ''+cipherraw'' which  &lt;br /&gt;
:uses no other libraries.&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is usefull  if the certificate and the configuration must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about persormed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt;    can be any string accepeted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(3pm)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Usefull if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:the protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptive curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these cjecks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  a-zA-Z_0-9,.\/()-  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. With  ''o-saft-docker'' and a&lt;br /&gt;
:''Dockerfile'' (both are part of the distribution), a proper Docker image&lt;br /&gt;
:will be build easily. o-saft-docker  can also be used to run commands&lt;br /&gt;
:with ''o-saft.pl'' inside the Docker image, example:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(1)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(1)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 16.09.16&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=253155</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=253155"/>
				<updated>2019-07-21T10:07:40Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* Certificates and CA */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:*       List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:*       Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:*       Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
&lt;br /&gt;
:Above applies to all commands except ''+cipherall'' and ''+cipherraw'' which  &lt;br /&gt;
:uses no other libraries.&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system. Note that  ''Net::SSLeay(3pm)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is usefull  if the certificate and the configuration must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about persormed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt;    can be any string accepeted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(1)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Usefull if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:the protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptive curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these cjecks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  a-zA-Z_0-9,.\/()-  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. With  ''o-saft-docker'' and a&lt;br /&gt;
:''Dockerfile'' (both are part of the distribution), a proper Docker image&lt;br /&gt;
:will be build easily. o-saft-docker  can also be used to run commands&lt;br /&gt;
:with ''o-saft.pl'' inside the Docker image, example:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(1)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(1)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 16.09.16&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=253154</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=253154"/>
				<updated>2019-07-21T10:05:14Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* OpenSSL, libssl, libcrypto */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:*       List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:*       Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:*       Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(3pm)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
&lt;br /&gt;
:Above applies to all commands except ''+cipherall'' and ''+cipherraw'' which  &lt;br /&gt;
:uses no other libraries.&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system.  NOTE that  ''Net::SSLeay(1)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is usefull  if the certificate and the configuration must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about persormed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt;    can be any string accepeted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(1)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Usefull if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:the protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptive curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these cjecks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  a-zA-Z_0-9,.\/()-  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. With  ''o-saft-docker'' and a&lt;br /&gt;
:''Dockerfile'' (both are part of the distribution), a proper Docker image&lt;br /&gt;
:will be build easily. o-saft-docker  can also be used to run commands&lt;br /&gt;
:with ''o-saft.pl'' inside the Docker image, example:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(1)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(1)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 16.09.16&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=253153</id>
		<title>O-Saft/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=O-Saft/Documentation&amp;diff=253153"/>
				<updated>2019-07-21T10:00:39Z</updated>
		
		<summary type="html">&lt;p&gt;Achim: /* Using outdated modules */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==O-Saft==&lt;br /&gt;
This is O-Saft's documentation as you get with:&lt;br /&gt;
 o-saft.pl --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;On Windows following must be used&lt;br /&gt;
 o-saft.pl --help --v&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__ &amp;lt;!-- autonumbering is ugly here, but can only be switched of by changing MediaWiki:Common.css --&amp;gt;&lt;br /&gt;
&amp;lt;!-- position left does not work as it overlaps some texts&lt;br /&gt;
{|align=right&lt;br /&gt;
 |&amp;lt;div&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]] [[Category:OWASP_Tool]] [[Category:SSL]] [[Category:Test]]&lt;br /&gt;
----&lt;br /&gt;
==== NAME ====&lt;br /&gt;
:       o-saft.pl - OWASP SSL advanced forensic tool&lt;br /&gt;
:                   OWASP SSL audit for testers&lt;br /&gt;
&lt;br /&gt;
==== DESCRIPTION====&lt;br /&gt;
:       This tools lists  information about remote target's  SSL  certificate&lt;br /&gt;
:       and tests the remote target according given list of ciphers.&lt;br /&gt;
:&lt;br /&gt;
:       Note:  Throughout this description  &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt; is used as an alias for the&lt;br /&gt;
:              program name &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
==== SYNOPSIS====&lt;br /&gt;
  o-saft.pl [COMMANDS ..] [OPTIONS ..] target [target target ...]&lt;br /&gt;
:&lt;br /&gt;
:       Where  [COMMANDS]  and  [OPTIONS]  are described below  and  &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt;&lt;br /&gt;
:       is a hostname either as full qualified domain name or as IP address.&lt;br /&gt;
:       Multiple commands and targets may be combined.&lt;br /&gt;
:&lt;br /&gt;
:       All  commands  and  options  can also be specified in a  rc-file, see&lt;br /&gt;
:       [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:       I.g. all commands start with a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  character and options start with  &lt;br /&gt;
:       &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  characters. Anything else is treated as target name.&lt;br /&gt;
&lt;br /&gt;
====QUICKSTART====&lt;br /&gt;
:       Before going into  a detailed description  of the  purpose and usage,&lt;br /&gt;
:       here are some examples of the most common use cases:&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers of target:&lt;br /&gt;
    o-saft.pl +cipher --enabled example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh example.tld&lt;br /&gt;
&lt;br /&gt;
:* Test all ciphers, even if not supported by local SSL implementation:&lt;br /&gt;
    o-saft.pl +cipherall example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Show details of certificate and connection of target:&lt;br /&gt;
    o-saft.pl +info example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check certificate, ciphers and SSL connection of target:&lt;br /&gt;
    o-saft.pl +check example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check connection to target for vulnerabilities:&lt;br /&gt;
    o-saft.pl +vulns example.tld&lt;br /&gt;
&lt;br /&gt;
:*       Check for all known ciphers (independant of SSL library):&lt;br /&gt;
    o-saft.pl example.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
:*       Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
:* List more usage examples&lt;br /&gt;
    o-saft.pl --help=examples&lt;br /&gt;
&lt;br /&gt;
:*       List all available commands:&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
:* Get table of contents for complete help&lt;br /&gt;
    o-saft.pl --help=toc&lt;br /&gt;
&lt;br /&gt;
:* Show just one section, for example SECURITY, from help&lt;br /&gt;
    o-saft.pl --help=SECURITY&lt;br /&gt;
&lt;br /&gt;
:*       Start the simple GUI&lt;br /&gt;
    o-saft.tcl&lt;br /&gt;
&lt;br /&gt;
:*       Start the simple GUI which uses ''o-saft.pl'' in a Docker image&lt;br /&gt;
    o-saft.tcl --docker&lt;br /&gt;
&lt;br /&gt;
:       For more specialised test cases, refer to the [[#COMMANDS|COMMANDS]] and [[#OPTIONS|OPTIONS]]&lt;br /&gt;
:       sections below. For more examples please refer to  [[#EXAMPLES|EXAMPLES]]  section.&lt;br /&gt;
&lt;br /&gt;
:  For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
==== WHY? ====&lt;br /&gt;
:       Why a new tool for checking SSL security and configuration when there&lt;br /&gt;
:       are already a dozen or more such good tools in existence (in 2012)?&lt;br /&gt;
&lt;br /&gt;
:       '''Unique features:'''&lt;br /&gt;
:* working in closed environments, i.e. '''without internet connection'''&lt;br /&gt;
:* checking availability of ciphers '''independent of installed library'''&lt;br /&gt;
:* checking for '''all possible ciphers''' (up to 65535 per SSL protocol)&lt;br /&gt;
:* mainly same results on all platforms.&lt;br /&gt;
&lt;br /&gt;
:       Currently available tools suffer from some or all of following issues:&lt;br /&gt;
&lt;br /&gt;
:* lack of tests of unusual SSL certificate configurations&lt;br /&gt;
:* may return different results for the same checks on a given target&lt;br /&gt;
:* missing tests for modern SSL/TLS functionality&lt;br /&gt;
:* missing tests for specific, known SSL/TLS vulnerabilities&lt;br /&gt;
:* no support for newer, advanced, features e.g. CRL, OCSP, EV&lt;br /&gt;
:* limited capability to create your own customised tests&lt;br /&gt;
&lt;br /&gt;
:       Other  reasons or problems  are that other tools are either binary or&lt;br /&gt;
:       use additional binaries and hence not portable to other platforms.&lt;br /&gt;
&lt;br /&gt;
:       In contrast to (all?) most other tools,  including openssl, it can be&lt;br /&gt;
:       used to `ask simple questions' like `does target support STS' just by&lt;br /&gt;
:       calling:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +hsts_sts example.tld&lt;br /&gt;
&lt;br /&gt;
:       For more, please see  [[#EXAMPLES|EXAMPLES]]  section below.&lt;br /&gt;
:       If it should run on systems with old software (perl or Perl modules),  &lt;br /&gt;
:       please see  [[#DEBUG|DEBUG]]  section below.&lt;br /&gt;
&lt;br /&gt;
==== SECURITY====&lt;br /&gt;
&lt;br /&gt;
:This tool is designed to be used by people doing security or forensic&lt;br /&gt;
:analyses. Hence no malicious input is expected.&lt;br /&gt;
&lt;br /&gt;
:There are no special security checks implemented. Some parameters are&lt;br /&gt;
:roughly sanatised according unwanted characters.  In particular there&lt;br /&gt;
:are no checks according any kind of code injection.&lt;br /&gt;
&lt;br /&gt;
:Care should be taken, when additional tools and modules are installed&lt;br /&gt;
:as described in  [[#INSTALLATION|INSTALLATION]]  below. In particular it is recommended&lt;br /&gt;
:to do these installations into directoies  specially prepared for use&lt;br /&gt;
:with &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; . No other tools of your system should use these installations&lt;br /&gt;
:i.e. by accident or because your environment variables point to them.&lt;br /&gt;
&lt;br /&gt;
:Note that compilation and installation of additional tools  (''openssl'',&lt;br /&gt;
:''Net::SSLeay'', etc.) uses known insecure configurations and features!&lt;br /&gt;
:This is essential to make &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; able to check for such insecurities.&lt;br /&gt;
&lt;br /&gt;
:It is  highly recommended to do these installations and use the tools&lt;br /&gt;
:on a separate testing system.&lt;br /&gt;
&lt;br /&gt;
:'''DO NOT USE THESE INSTALLATIONS ON PRODUCTIVE SYTEMS.'''&lt;br /&gt;
&lt;br /&gt;
==== TECHNICAL INFORMATION====&lt;br /&gt;
&lt;br /&gt;
:It is important to understand, which provided information is based on&lt;br /&gt;
:data returned by underlaying (used) libraries and the information &lt;br /&gt;
:computed directly.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL, libssl, libcrypto =====&lt;br /&gt;
:In general the tool uses Perl's  ''Net::SSLeay(1)'' module which itself&lt;br /&gt;
:is based on libssl and/or libssleay library of the operating system.&lt;br /&gt;
:It's possible to use other versions of these libraries, see options:&lt;br /&gt;
&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
:*  --lib-path=PATH --lib=PATH&lt;br /&gt;
:*  --envlibvar=NAME&lt;br /&gt;
&lt;br /&gt;
:The external  ''openssl(1)'' is called to extract some information from&lt;br /&gt;
:its output.  The version of openssl can be controlled  with following&lt;br /&gt;
:options:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=TOOL&lt;br /&gt;
:*  --no-openssl&lt;br /&gt;
:*  --force-openssl&lt;br /&gt;
:*  --exe-path=PATH --exe=PATH&lt;br /&gt;
&lt;br /&gt;
:Above applies to all commands except ''+cipherall'' and ''+cipherraw'' which  &lt;br /&gt;
:uses no other libraries.&lt;br /&gt;
&lt;br /&gt;
:OpenSSL is recommended to be used for libssl and libcrypto.  Versions&lt;br /&gt;
:0.9.8k to 1.0.2e (Jan. 2016) are known to work. However, versions be-&lt;br /&gt;
:for 1.0.0 may not provide all informations.&lt;br /&gt;
:Some functionality (checks) of  O-Saft  may be missing or fail,  when&lt;br /&gt;
:openssl versions 1.1.x are used (because functionality was removed).&lt;br /&gt;
:LibreSSL is not recommended, because  some functionallity  considered&lt;br /&gt;
:insecure, has been removed.&lt;br /&gt;
:For more details, please see  [[#INSTALLATION|INSTALLATION]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Certificates and CA=====&lt;br /&gt;
:All checks according the validity of the certificate chain  are based&lt;br /&gt;
:on the root CAs installed on the system.  NOTE that  ''Net::SSLeay(1)''&lt;br /&gt;
:and  ''openssl(1)''  may have their own rules how and where to find the&lt;br /&gt;
:root CAs.  Please refer to the documentation on your system for these&lt;br /&gt;
:tools. However, there are folloing options to tweak these rules:&lt;br /&gt;
&lt;br /&gt;
:*  --ca-file=FILE&lt;br /&gt;
:*  --ca-path=DIR&lt;br /&gt;
:*  --ca-depth=INT&lt;br /&gt;
&lt;br /&gt;
===== Commands and options=====&lt;br /&gt;
:All arguments  starting with  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  are considered  [[#COMMANDS|COMMANDS]]  for this&lt;br /&gt;
:tool. All arguments starting with  &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;  are considered  [[#OPTIONS|OPTIONS]]  for&lt;br /&gt;
:this tool. &lt;br /&gt;
&lt;br /&gt;
:Reading any data from STDIN or here-documents is not yet supported.&lt;br /&gt;
:It's reserved for future use.&lt;br /&gt;
&lt;br /&gt;
===== Environment variables=====&lt;br /&gt;
:Following environment variables are incorporated:&lt;br /&gt;
:* OPENSSL         - if set, full path to openssl executable&lt;br /&gt;
:* OPENSSL_CONF    - if set, full path to openssl's openssl.cnf or&lt;br /&gt;
:                    directory where to find openssl.cnf&lt;br /&gt;
:* LD_LIBRARY_PATH - used and extended with definitions from options&lt;br /&gt;
&lt;br /&gt;
===== Requirements=====&lt;br /&gt;
:For checking all ciphers and all protocols with  ''+cipherall''  command,&lt;br /&gt;
:'''just perl (5.x) without any modules''' is required.&lt;br /&gt;
:For  ''+info''  and  ''+check''  (and all related) commands,  perl (5.x) with&lt;br /&gt;
:following modules (minimal version) is required:&lt;br /&gt;
&lt;br /&gt;
:* IO              1.25 (2011)&lt;br /&gt;
:* IO::Socket:INET 1.37 (2011)&lt;br /&gt;
:* IO::Socket:SSL  1.90 (2013) &lt;br /&gt;
:* Net::DNS        0.66 (2011)&lt;br /&gt;
:* Net::SSLeay     1.49 (2012)&lt;br /&gt;
&lt;br /&gt;
:However, it is recommended to use the most recent version of the mod-&lt;br /&gt;
:ules which then gives more accurate results and less warnings. If the&lt;br /&gt;
:modules are missing, they can be installed i.e. with:&lt;br /&gt;
   cpan Net::SSLeay&lt;br /&gt;
&lt;br /&gt;
:Note: if you want to use advanced features of openssl or Net::SSLeay,&lt;br /&gt;
:please see  [[#INSTALLATION|INSTALLATION]]  section how to compile and install the tools&lt;br /&gt;
:fully customized.&lt;br /&gt;
&lt;br /&gt;
:Also an ''openssl'' executable should be available, but is not mandatory.&lt;br /&gt;
&lt;br /&gt;
:For checking DH parameters of ciphers, openssl 1.0.2  or newer should&lt;br /&gt;
:be available. If an older version of openssl is found, we try hard to&lt;br /&gt;
:extract the DH parameters from the data returned by the server, see&lt;br /&gt;
:''+cipher-dh''  command.&lt;br /&gt;
&lt;br /&gt;
:If you need to run on systems with older perl or Perl module versions&lt;br /&gt;
:please refer to the  [[#DEBUG|DEBUG]]  section for more inofrmation.&lt;br /&gt;
&lt;br /&gt;
==== RESULTS====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:All output is designed to be easily parsed by postprocessors. Please&lt;br /&gt;
:see  [[#OUTPUT|OUTPUT]]  section below for details.&lt;br /&gt;
&lt;br /&gt;
: For the results,  we have to distinguish those returned by  ''+cipher''&lt;br /&gt;
: command  and those from all other tests and checks like  ''+check''  or&lt;br /&gt;
: ''+info''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:The cipher checks will return one line for each tested cipher. It&lt;br /&gt;
:contains at least the cipher name,  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  whether it's&lt;br /&gt;
:supported or not, and a security qualification. It may look like:&lt;br /&gt;
&lt;br /&gt;
    AES256-SHA       yes    HIGH&lt;br /&gt;
    NULL-SHA         no     weak&lt;br /&gt;
&lt;br /&gt;
:Depending on the used  ''--legacy=*''  option the format may differ&lt;br /&gt;
:and also contain more information.  For details see  ''--legacy=*''&lt;br /&gt;
:option below.&lt;br /&gt;
&lt;br /&gt;
:The text for security qualifications are mainly those returned by&lt;br /&gt;
:openssl (version 1.0.1): LOW, MEDIUM, HIGH and WEAK.&lt;br /&gt;
:The same texts but with all lower case characters are used if the&lt;br /&gt;
:qualification was adapted herein. Following rules for adjusting the&lt;br /&gt;
:qualification were used:&lt;br /&gt;
&lt;br /&gt;
:* weak:&lt;br /&gt;
:** all *NULL* ciphers&lt;br /&gt;
:** all *RC4*  ciphers&lt;br /&gt;
:** all *EXPORT* ciphers&lt;br /&gt;
:** all *anon* (aka ADH aka DHA) ciphers&lt;br /&gt;
:** all *CBC* and *CBC3* (aka 3DES) ciphers&lt;br /&gt;
:* low:&lt;br /&gt;
:* high:&lt;br /&gt;
:** all *AES(128|256)* ciphers&lt;br /&gt;
:** all *CAMELLIA* ciphers&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    These tests return a line with a label describing the test  and a&lt;br /&gt;
:    test result for it.  The  idea is to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  if the result&lt;br /&gt;
:    is considered &amp;quot;secure&amp;quot; and report the reason why it is considered&lt;br /&gt;
:    insecure otherwise. Example of a check considered secure:&lt;br /&gt;
        Label of the performed check:           yes&lt;br /&gt;
:    Example of a check considered insecure:&lt;br /&gt;
        Label of the performed check:           no (reason why)&lt;br /&gt;
&lt;br /&gt;
:    Note that there are tests where the results appear confusing when&lt;br /&gt;
:    first viewed, like for www.wi.ld:&lt;br /&gt;
        Certificate is valid according given hostname:  no (*.wi.ld)&lt;br /&gt;
        Certificate's wildcard does not match hostname: yes&lt;br /&gt;
:    This can for example occur with:&lt;br /&gt;
        Certificate Common Name:                *.wi.ld&lt;br /&gt;
        Certificate Subject's Alternate Names:  DNS:www.wi.ld&lt;br /&gt;
&lt;br /&gt;
:    Please check the result with the  ''+info''  command also to verify&lt;br /&gt;
:    if the check sounds reasonable.&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:    The test result contains  detailed information.  The labels there&lt;br /&gt;
:    are mainly the same as for the  &amp;quot;+check&amp;quot;  command.&lt;br /&gt;
&lt;br /&gt;
==== COMMANDS====&lt;br /&gt;
&lt;br /&gt;
: There are commands for various tests according the  SSL connection to&lt;br /&gt;
: the target, the targets certificate and the used ciphers.&lt;br /&gt;
&lt;br /&gt;
: All commands are preceded by a  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;  to easily distinguish from other&lt;br /&gt;
: arguments and options. However, some  ''--OPT''  options are treated as&lt;br /&gt;
: commands for historical reason or compatibility to other programs.&lt;br /&gt;
&lt;br /&gt;
: The most important commands are (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
: ''+check'' ''+cipher'' ''+info'' +http'' ''+list'' ''+quick'' ''+sni'' ''+sni_check'' ''+version''&lt;br /&gt;
&lt;br /&gt;
: A list of all available commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cmds&lt;br /&gt;
&lt;br /&gt;
: The description of all other commands will be printed with&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The summary and internal commands return requested information or the&lt;br /&gt;
: results of checks. These are described below.&lt;br /&gt;
&lt;br /&gt;
: Note that some commands may be a combination of other commands, see:&lt;br /&gt;
    o-saft.pl --header --help=intern&lt;br /&gt;
&lt;br /&gt;
: The following sub-sections only describe the commands,  which do more&lt;br /&gt;
: than giving a simple information from the target.  All other commands&lt;br /&gt;
: can be listed with:&lt;br /&gt;
    $0 --header --help=commands&lt;br /&gt;
&lt;br /&gt;
: The final sub-sections  [[#Notes about commands|Notes about commands]]  describes some notes&lt;br /&gt;
: about special commands and related commands.&lt;br /&gt;
&lt;br /&gt;
===== Commands for information about this tool=====&lt;br /&gt;
&lt;br /&gt;
: All these commands will exit after execution (cannot be used together&lt;br /&gt;
: with other commands).&lt;br /&gt;
&lt;br /&gt;
====== +ciphers======&lt;br /&gt;
&lt;br /&gt;
:     Show ciphers offered by local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    This commands prints the ciphers in format like &amp;lt;code&amp;gt;openssl ciphers&amp;lt;/code&amp;gt;&lt;br /&gt;
:    does. It also accepts the  ''-v''  and  ''-V''  option. The  ''--legacy=TYPE'' &lt;br /&gt;
:    option can be used as described for  ''+list''  command.&lt;br /&gt;
:    Use  ''+list''  command for more information according ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +list======&lt;br /&gt;
&lt;br /&gt;
:     Show all ciphers  known by this tool.  This includes cryptogrphic&lt;br /&gt;
:     details of the cipher and some internal details about the rating.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+ciphers''  command  ''+list''  uses TAB characters&lt;br /&gt;
:    instead of spaces to seperate columns. It also prints table header&lt;br /&gt;
:    lines by default. &lt;br /&gt;
&lt;br /&gt;
:    Different output formats are used for the  ''--legacy''  option:&lt;br /&gt;
:*         --legacy=simple        - tabular output of cipher values&lt;br /&gt;
:*         --legacy=full          - as ''--legacy=simple'' but more data&lt;br /&gt;
:*         --legacy=openssl       - output like with ''+cipher'' command&lt;br /&gt;
:*         --legacy=ssltest       - output like &amp;lt;code&amp;gt;ssltest --list&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- disabled since VERSION 15.01.07&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +VERSION======&lt;br /&gt;
&lt;br /&gt;
:Just show version and exit.&lt;br /&gt;
&lt;br /&gt;
====== +version======&lt;br /&gt;
&lt;br /&gt;
:     Show version information for both the program and the Perl modules&lt;br /&gt;
:     that it uses, then exit.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show more details.&lt;br /&gt;
&lt;br /&gt;
====== +libversion======&lt;br /&gt;
&lt;br /&gt;
:     Show version of openssl.&lt;br /&gt;
&lt;br /&gt;
====== +quit======&lt;br /&gt;
&lt;br /&gt;
:Show internal data and exit, used for testing and debugging only.&lt;br /&gt;
:Please see  [[#NTESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Commands to check SSL details=====&lt;br /&gt;
&lt;br /&gt;
:     Following (summary, internal) commands  are simply a shortcut for&lt;br /&gt;
:     a list of other commands. For details of the list use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
====== +check======&lt;br /&gt;
&lt;br /&gt;
:    Check the SSL connection for security issues. Implies  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
====== +host +target======&lt;br /&gt;
&lt;br /&gt;
:Print details about the targets hostname, DNS, etc.                  &lt;br /&gt;
:These details are usually printed only for the  ''+check''  and  ''+info''    &lt;br /&gt;
:command, but not for any individual command.&lt;br /&gt;
&lt;br /&gt;
====== +http======&lt;br /&gt;
&lt;br /&gt;
:     Perform HTTP checks (like STS, redirects etc.).&lt;br /&gt;
&lt;br /&gt;
====== +info======&lt;br /&gt;
&lt;br /&gt;
:     Overview of most important details of the SSL connection.&lt;br /&gt;
&lt;br /&gt;
:     Use ''--v'' option to show details also, which span multiple lines.&lt;br /&gt;
&lt;br /&gt;
====== +info--v======&lt;br /&gt;
&lt;br /&gt;
:     Overview of all details of the SSL connection. This is a shortcut&lt;br /&gt;
:     for all commands listed below but not including ''+cipher''.&lt;br /&gt;
&lt;br /&gt;
:     This command is intended for debugging  as it prints some details&lt;br /&gt;
:     from the used  ''Net::SSLinfo''  module.&lt;br /&gt;
&lt;br /&gt;
====== +quick======&lt;br /&gt;
&lt;br /&gt;
:     Quick overview of checks. Implies ''--enabled''  and  ''--label=short''.&lt;br /&gt;
&lt;br /&gt;
====== +pfs======&lt;br /&gt;
&lt;br /&gt;
: Check if servers offers ciphers with prefect forward secrecy (PFS)&lt;br /&gt;
&lt;br /&gt;
====== +protocols======&lt;br /&gt;
&lt;br /&gt;
: Check for protocols supported by target.&lt;br /&gt;
&lt;br /&gt;
====== +vulns======&lt;br /&gt;
&lt;br /&gt;
: Check for various vulnerabilities.&lt;br /&gt;
&lt;br /&gt;
====== +sts +hsts======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according STS HTTP header.&lt;br /&gt;
:     This option implies  ''--http'',  means that  ''--no-http'' is ignored.&lt;br /&gt;
&lt;br /&gt;
====== +sni======&lt;br /&gt;
:     Check for Server Name Indication (SNI) usage.&lt;br /&gt;
&lt;br /&gt;
====== +sni_check +check_sni======&lt;br /&gt;
&lt;br /&gt;
:     Check for  Server Name Indication (SNI) usage and validity of all&lt;br /&gt;
:     names (CN, subjectAltName, FQDN, etc.).&lt;br /&gt;
&lt;br /&gt;
====== +bsi======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according BSI TR-02102-2 and TR-03116-4 compliance.&lt;br /&gt;
&lt;br /&gt;
====== +ev======&lt;br /&gt;
&lt;br /&gt;
:     Various checks according certificate's extended Validation (EV).&lt;br /&gt;
&lt;br /&gt;
:     Hint: use option ''--v --v'' to get information about failed checks.&lt;br /&gt;
&lt;br /&gt;
====== +sizes======&lt;br /&gt;
&lt;br /&gt;
:     Check length, size and count of some values in the certificate.&lt;br /&gt;
&lt;br /&gt;
====== +s_client======&lt;br /&gt;
&lt;br /&gt;
:     Dump data retrieved from &amp;lt;code&amp;gt; openssl s_client ...&amp;lt;/code&amp;gt;  call. Should be&lt;br /&gt;
:     used for debugging only.&lt;br /&gt;
:     It can be used just like openssl itself, for example:&lt;br /&gt;
         openssl s_client -connect host:443 -no_sslv2&lt;br /&gt;
&lt;br /&gt;
====== +dump======&lt;br /&gt;
&lt;br /&gt;
:     Dumps internal data for SSL connection and target certificate.&lt;br /&gt;
:     This is mainly for debugging and should not be used together with&lt;br /&gt;
:     other commands (except ''+cipher'').&lt;br /&gt;
:     Each key-value pair is enclosed in &amp;lt;code&amp;gt;#{&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;#}&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:     Using ''--trace --trace'' dumps data of  ''Net::SSLinfo''  too.&lt;br /&gt;
&lt;br /&gt;
====== +exec======&lt;br /&gt;
&lt;br /&gt;
:     Command used internally when requested to use other libraries.&lt;br /&gt;
:     This command should not be used directly.&lt;br /&gt;
&lt;br /&gt;
===== Commands to test ciphers provided by target=====&lt;br /&gt;
&lt;br /&gt;
: Beside the description of the commands itself here, please see also  &lt;br /&gt;
: [[#Notes about commands]]  below.&lt;br /&gt;
&lt;br /&gt;
====== +cipher======&lt;br /&gt;
&lt;br /&gt;
:     Check target for ciphers, either all ciphers or ciphers specified&lt;br /&gt;
:     with ''--cipher=*'' option.&lt;br /&gt;
&lt;br /&gt;
:     Note that ciphers  not supported  by the local SSL implementation&lt;br /&gt;
:     are not checked by default, use ''+cipherall'' or ''+cipherraw'' command for that.&lt;br /&gt;
&lt;br /&gt;
: Use  ''--v''  option to see all ciphers being checked.&lt;br /&gt;
&lt;br /&gt;
====== +cipherraw======&lt;br /&gt;
&lt;br /&gt;
:     Check target for all possible ciphers.&lt;br /&gt;
:     Does not depend on local SSL implementation.&lt;br /&gt;
&lt;br /&gt;
:    In contrast to  ''+cipher''  this command has some options to tweak&lt;br /&gt;
:    the cipher tests, connection results, and some strange behaviours&lt;br /&gt;
:    of the target. See [[#Options for  cipherall and cipherraw  command]] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- other names: +allciphers +rawciphers +cipherall --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== +cipherall ======&lt;br /&gt;
&lt;br /&gt;
: Same as  ''+cipherraw''  but ouput format similat to  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Lists the cipher selected by the server for each protocol sometimes&lt;br /&gt;
: referred to as &amp;quot;default cipher&amp;quot;.&lt;br /&gt;
: For each protocol the two selected ciphers are shown,  one returned&lt;br /&gt;
: by the server if the cipher list in the  ClientHello is sorted with&lt;br /&gt;
: the strongest cipher first, and one returned  if the cipher list in&lt;br /&gt;
: the ClientHello is sorted with strongest cipher last.&lt;br /&gt;
: See  [[#Notes about commands]]  for details.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-dh======&lt;br /&gt;
&lt;br /&gt;
: Checked target for ciphers. All ciphers supported by the server are&lt;br /&gt;
: printed with their DH or ECDH paramaters (if available).&lt;br /&gt;
: ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-null  +null======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts NULL ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-adh +adh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts ciphers with anonymous key exchange.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-exp +export======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts EXPORT ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-cbc +cbc======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-des +des======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts DES ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-rc4======&lt;br /&gt;
&lt;br /&gt;
:   Check if target accepts RC4 ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-edh +edh======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ephemeral ciphers.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-pfs======&lt;br /&gt;
&lt;br /&gt;
:   Check if target supports ciphers with PFS.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects strongest cipher.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-weak======&lt;br /&gt;
&lt;br /&gt;
:   Check if target selects weak cipher (oposite of ''+cipher-strong'').&lt;br /&gt;
&lt;br /&gt;
===== Discrete commands to test SSL connection and certificate details=====&lt;br /&gt;
&lt;br /&gt;
: Discrete commands, please see:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=commands&lt;br /&gt;
&lt;br /&gt;
===== Notes about commands=====&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipherall======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  can only check for ciphers - more precise: cipher suites -&lt;br /&gt;
: provided by the local SSL implementation (i.e. libssl).&lt;br /&gt;
: ''+cipherall''  can check for any cipher,  as it just uses the cipher's&lt;br /&gt;
: integer value in the range 0 .. 65532.&lt;br /&gt;
&lt;br /&gt;
====== +cipherall vs. +cipherraw======&lt;br /&gt;
: These commands are identical, just the output format is different.&lt;br /&gt;
&lt;br /&gt;
====== +cipher vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: Both commands show the default cipher foreach protocol.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher''  lists a summary of ciphers selected by the server for each&lt;br /&gt;
: protocol requested by the user (for example by using options like:&lt;br /&gt;
: ''--sslv3'' ''--tlsv1'' etc.).  When the  --v  option is used, all selected&lt;br /&gt;
: ciphers for all known protocols are listed. This summary focuses on  &lt;br /&gt;
: counts for various ciphers.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-selected vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-selected''  lists the cipher selected by the server if no particular&lt;br /&gt;
: protocol was specified and the system's default cipher list is send&lt;br /&gt;
: in the ClientHello to the server.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  selected cipher by the server for each&lt;br /&gt;
: protocol.&lt;br /&gt;
&lt;br /&gt;
====== +cipher-strong vs. +cipher-default======&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-strong''  shows the result of the check if strong ciphers are&lt;br /&gt;
: preferred by the server. It is a check command.&lt;br /&gt;
&lt;br /&gt;
: ''+cipher-default''  lists the  cipher selected  by the server for each&lt;br /&gt;
: protocol. It is a information command.&lt;br /&gt;
&lt;br /&gt;
: It is not possible to check if a server uses 'SSLHonorCipherOrder'.&lt;br /&gt;
: Even if it is used (switched on),  it is not possible to  check the&lt;br /&gt;
: specified order of the ciphers. &lt;br /&gt;
&lt;br /&gt;
: I. g. it is expected that the order is according the cipher suite's&lt;br /&gt;
: strength, meaning the most strongest first, and the weakest last.&lt;br /&gt;
: It does not make sense to use an order where a weak cipher preceeds&lt;br /&gt;
: a stronger one. Such a (mis-)configuration should be detected.&lt;br /&gt;
&lt;br /&gt;
: Having this in mind, the algorithm to detect a  proper cipher order&lt;br /&gt;
: is as simply as follows:&lt;br /&gt;
    1. pass sorted cipher list with strongest cipher first&lt;br /&gt;
    2. pass sorted cipher list with strongest cipher last&lt;br /&gt;
: if the server returns the same cipher for both checks, it's assumed&lt;br /&gt;
: that it prefers to use the most strongest cipher. In this case it's&lt;br /&gt;
: obvious that 'SSLHonorCipherOrder' is set (exceptions see below).&lt;br /&gt;
&lt;br /&gt;
: ''+cipherall''  uses a  more accurate algorithm  to detect the server's&lt;br /&gt;
: cipher order.&lt;br /&gt;
&lt;br /&gt;
: '''Exceptions:'''&lt;br /&gt;
: If either, the server or the client,  uses only one cipher suite in&lt;br /&gt;
: the list, SSLHonorCipherOrder cannot be detected at all.&lt;br /&gt;
: The same happens, if only one cipher in the client's list matches a&lt;br /&gt;
: cipher in the server's list.&lt;br /&gt;
&lt;br /&gt;
====== +extensions vs. +tlsextensions======&lt;br /&gt;
&lt;br /&gt;
: ''+extensions''  shows the &amp;quot;Certificate extensions&amp;quot; and  ''+tlsextensions''&lt;br /&gt;
: will show the TLS protocol extensions.&lt;br /&gt;
: Use  ''+tlsextdebug''  to show more informations about the TLS protocol&lt;br /&gt;
: extensions.&lt;br /&gt;
&lt;br /&gt;
====== +http2 +spdy +spdy3 +spdy31 +spdy4 +prots======&lt;br /&gt;
&lt;br /&gt;
: These commands are just an alias for the  ''+protocols''  command.&lt;br /&gt;
&lt;br /&gt;
====== +hostname vs. +wildhost vs. +altname vs. +rfc_2818======&lt;br /&gt;
&lt;br /&gt;
:The commands  ''+cn''  and  ''+altname''  print the  information stored  in &lt;br /&gt;
:the certificate.&lt;br /&gt;
:The command  ''+hostname''  checks if the given hostname matches the CN &lt;br /&gt;
:value in the certificate.  Note that wildcard names in the CN, only &lt;br /&gt;
:allow to contain one '*'.&lt;br /&gt;
:The command  ''+wildcard''  checks if the given hostname does not match &lt;br /&gt;
:any name specified in the certificate's &amp;quot;subjectAltname&amp;quot;. This check&lt;br /&gt;
:is usefull  if the certificate and the configuration must comply to&lt;br /&gt;
:RFC 6125 or EV certificates.&lt;br /&gt;
&lt;br /&gt;
==== OPTIONS====&lt;br /&gt;
&lt;br /&gt;
: All options are written in lowercase. Words written in all capital in&lt;br /&gt;
: the description here is text provided by the user.&lt;br /&gt;
&lt;br /&gt;
===== Options for help and documentation=====&lt;br /&gt;
&lt;br /&gt;
====== --h======&lt;br /&gt;
&lt;br /&gt;
====== --help======&lt;br /&gt;
&lt;br /&gt;
:   WYSIWYG&lt;br /&gt;
&lt;br /&gt;
====== --help=help ======&lt;br /&gt;
:Show available options to show descriptions (this Options section).&lt;br /&gt;
&lt;br /&gt;
====== --help=cmds======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=commands======&lt;br /&gt;
&lt;br /&gt;
:   Show available commands with short description.&lt;br /&gt;
&lt;br /&gt;
====== --help=opt======&lt;br /&gt;
&lt;br /&gt;
:   Show available options; short form.&lt;br /&gt;
&lt;br /&gt;
====== --help=options======&lt;br /&gt;
&lt;br /&gt;
:   Show available options with their description.&lt;br /&gt;
&lt;br /&gt;
====== --help=checks======&lt;br /&gt;
&lt;br /&gt;
:   Show available checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=tools======&lt;br /&gt;
&lt;br /&gt;
:Description of tools around O-Saft, when, where and how to use.&lt;br /&gt;
&lt;br /&gt;
====== --help=cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=cfg-cmd======&lt;br /&gt;
&lt;br /&gt;
:Show additional and user specified commands.  Output can be used in&lt;br /&gt;
:[[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=check-cfg --help=cfg-check======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used as labels in output for checks (see  ''+check'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=data======&lt;br /&gt;
&lt;br /&gt;
:   Show available informations.&lt;br /&gt;
&lt;br /&gt;
====== --help=data-cfg --help=cfg-data --help=cfg-info======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used  as labels in output for  data  (see  ''+info'')  ready&lt;br /&gt;
:   for use in  [[#RC-FILE|RC-FILE]]  or as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=hint-cfg --help=cfg-hint======&lt;br /&gt;
&lt;br /&gt;
:   Show texts used in hint messages ready for use in  [[#RC-FILE|RC-FILE]]  or as&lt;br /&gt;
:   option.&lt;br /&gt;
&lt;br /&gt;
====== --help=text======&lt;br /&gt;
:   Show texts used in various messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=text-cfg --help=cfg-text======&lt;br /&gt;
&lt;br /&gt;
:    Show texts used in various messages ready for use in  [[#RC-FILE|RC-FILE]]  or&lt;br /&gt;
:    as option.&lt;br /&gt;
&lt;br /&gt;
====== --help=legacy======&lt;br /&gt;
&lt;br /&gt;
:   Show possible legacy formats (used as value in  [[#--legacy=KEY|--legacy=KEY]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=compliance======&lt;br /&gt;
&lt;br /&gt;
:   Show available compliance checks.&lt;br /&gt;
&lt;br /&gt;
====== --help=intern======&lt;br /&gt;
&lt;br /&gt;
:   Show internal commands.&lt;br /&gt;
&lt;br /&gt;
====== --help=range======&lt;br /&gt;
: Show list of cipherranges (see [[#--cipherrange=RANGE--cipherrange=RANGE]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=alias======&lt;br /&gt;
: Show alias for commands and options.&lt;br /&gt;
&lt;br /&gt;
====== --help=pattern======&lt;br /&gt;
: Show list of cipher pattern (used for  [[#--cipher=CIPHER|--cipher=CIPHER]]).&lt;br /&gt;
&lt;br /&gt;
====== --help=score======&lt;br /&gt;
&lt;br /&gt;
:   Show score value for each check.&lt;br /&gt;
:   Value is printed in format to be used for  ''--cfg_score=KEY=SCORE''.&lt;br /&gt;
&lt;br /&gt;
:   Note that the  sequence  of options  is important.  Use the options&lt;br /&gt;
:   ''--trace''  and/or  ''--cfg_score=KEY=SCORE''  before  ''--help=score''.&lt;br /&gt;
&lt;br /&gt;
====== --help=toc  --help=content======&lt;br /&gt;
:   Show headlines from help textsUseful to get an overview.&lt;br /&gt;
&lt;br /&gt;
====== --help=SECTION======&lt;br /&gt;
&lt;br /&gt;
:   Show  &amp;lt;code&amp;gt;SECTION&amp;lt;/code&amp;gt;  from documentation, see  [[#--help=toc|--help=toc]]  for a list.&lt;br /&gt;
:   Example:&lt;br /&gt;
      o-saft.pl --help=EXAMPLES&lt;br /&gt;
&lt;br /&gt;
====== --help=regex======&lt;br /&gt;
&lt;br /&gt;
:   Show regular expressions used internally.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-html======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in HTML format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-pod======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in POD format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-wiki======&lt;br /&gt;
&lt;br /&gt;
:  Show help text in mediawiki format.&lt;br /&gt;
&lt;br /&gt;
====== --help=gen-cgi======&lt;br /&gt;
&lt;br /&gt;
:  Generate HTML page with o-saft.cgi as form action..&lt;br /&gt;
&lt;br /&gt;
====== --help=error --help=warning --help=problem ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  section with  description of known  error and&lt;br /&gt;
:warning messages.&lt;br /&gt;
&lt;br /&gt;
====== --help=FAQ ======&lt;br /&gt;
&lt;br /&gt;
:Show  [[#KNOWN PROBLEMS|KNOWN PROBLEMS]]  and  [[#LIMITATIONS|LIMITATIONS]]  section.&lt;br /&gt;
&lt;br /&gt;
====== --help=glossar======&lt;br /&gt;
&lt;br /&gt;
:  Show common abbreviation used in the world of security.&lt;br /&gt;
&lt;br /&gt;
====== --help=links======&lt;br /&gt;
:  Show list of URLs related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=rfc======&lt;br /&gt;
:  Show list of RFC related to SSL/TLS.&lt;br /&gt;
&lt;br /&gt;
====== --help=todo======&lt;br /&gt;
:  Show known problems and bugs.&lt;br /&gt;
&lt;br /&gt;
====== --help=exit======&lt;br /&gt;
:  Show possible  ''--exit=KEY''  options. Used for debugging only.&lt;br /&gt;
&lt;br /&gt;
====== --help=program.code======&lt;br /&gt;
:  For developers.&lt;br /&gt;
&lt;br /&gt;
===== Options for all commands (general)=====&lt;br /&gt;
====== --dns======&lt;br /&gt;
&lt;br /&gt;
:   Do DNS lookups to map given hostname to IP, do a reverse lookup.&lt;br /&gt;
&lt;br /&gt;
====== --no-dns======&lt;br /&gt;
&lt;br /&gt;
:   Do not make DNS lookups.&lt;br /&gt;
:   Note  that the corresponding IP and reverse hostname may be missing&lt;br /&gt;
:   in some messages then.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST======&lt;br /&gt;
&lt;br /&gt;
:   Specify &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; as target to be checked. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --port=PORT======&lt;br /&gt;
&lt;br /&gt;
:   Specify target's &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; to be used. Legacy option.&lt;br /&gt;
&lt;br /&gt;
====== --host=HOST --port=PORT HOST:PORT HOST======&lt;br /&gt;
&lt;br /&gt;
:   When giving more than one HOST argument,  the sequence of the given&lt;br /&gt;
:   HOST argument and the given  ''--port=PORT''  and the given ''--host=HOST''&lt;br /&gt;
:   options are important.&lt;br /&gt;
:   The rule how ports and hosts are mapped is as follows:&lt;br /&gt;
:   *    HOST:PORT arguments are used as is (connection to HOST on PORT)&lt;br /&gt;
:   *    only HOST is given, then previous specified ''--port=PORT'' is used&lt;br /&gt;
:   Note that URLs are treated as HOST:PORT, if they contain a port.&lt;br /&gt;
:   Example:&lt;br /&gt;
    o-saft.pl +cmd host-1 --port 23 host-2 host-3:42 host-4&lt;br /&gt;
:   will connect to:&lt;br /&gt;
       host-1:443&lt;br /&gt;
       host-2:23&lt;br /&gt;
       host-3:42&lt;br /&gt;
       host-4:23&lt;br /&gt;
&lt;br /&gt;
====== --proxyhost=PROXYHOST --proxy=PROXYHOST:PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:Make all connection to target using &amp;lt;code&amp;gt;PROXYHOST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Also possible is: ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT''&lt;br /&gt;
&lt;br /&gt;
====== --proxyport=PROXYPORT======&lt;br /&gt;
&lt;br /&gt;
:   Make all connection to target using PROXYHOST:PROXYPORT.&lt;br /&gt;
&lt;br /&gt;
====== --proxyuser=PROXYUSER======&lt;br /&gt;
&lt;br /&gt;
:   Specify username for proxy authentication.&lt;br /&gt;
&lt;br /&gt;
====== --proxypass=PROXYPASS======&lt;br /&gt;
&lt;br /&gt;
:   Specify password for proxy authentication.&lt;br /&gt;
:   ''--proxy=PROXYUSER:PROXYPASS@PROXYHOST:PROXYPORT'' is also possible.&lt;br /&gt;
&lt;br /&gt;
====== --starttls======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via SMTP.&lt;br /&gt;
:  This option is a shortcut for  ''--starttls=SMTP''&lt;br /&gt;
&lt;br /&gt;
====== --starttls=PROT======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; command to start a TLS connection via protocol.&lt;br /&gt;
:  &amp;lt;code&amp;gt;PROT&amp;lt;/code&amp;gt;  may be any of:  &amp;lt;code&amp;gt;SMTP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IMAP2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;POP3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FTPS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LDAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RDP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;XMPP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:  For  ''--starttls=SMTP'' see  ''--dns-mx''  also to use MX records instead&lt;br /&gt;
:  of host&lt;br /&gt;
&lt;br /&gt;
====== --starttls-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait before sending a packet, to slow down the&lt;br /&gt;
:  &amp;lt;code&amp;gt;STARTTLS&amp;lt;/code&amp;gt; requests. Default is 0.&lt;br /&gt;
:  This may prevent blocking of requests by the target due to too much&lt;br /&gt;
:  or too fast connections.&lt;br /&gt;
:  Note:  In this case there is an automatic suspension and retry with&lt;br /&gt;
:  a longer delay.&lt;br /&gt;
&lt;br /&gt;
====== --cgi, --cgi-exec======&lt;br /&gt;
&lt;br /&gt;
:  Internal use for CGI mode only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL tool=====&lt;br /&gt;
====== --no-rc======&lt;br /&gt;
&lt;br /&gt;
: Do not read  [[#RC-FILE|RC-FILE]] .&lt;br /&gt;
&lt;br /&gt;
====== --rc======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  if exists, from directory where program was found.&lt;br /&gt;
&lt;br /&gt;
====== --rc=path/to/FILE ======&lt;br /&gt;
&lt;br /&gt;
: Read  [[#RC-FILE|RC-FILE]]  &amp;lt;code&amp;gt;path/to/FILE&amp;lt;/code&amp;gt; if exists.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode======&lt;br /&gt;
:The exit status code will be greater 0, if any of following applies:&lt;br /&gt;
:* any check returns  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:* insecure protocols are available&lt;br /&gt;
:* insecure ciphers are supported&lt;br /&gt;
:* ciphers without PFS are supported&lt;br /&gt;
:In particular, the status code will be the total count of all these&lt;br /&gt;
:checks. The status code will also be printed at end, like:&lt;br /&gt;
    # EXIT 23&lt;br /&gt;
&lt;br /&gt;
:Parts of these checks can be diasabled,  see  ''--exitcode-*''  options&lt;br /&gt;
:below.&lt;br /&gt;
&lt;br /&gt;
:Use  ''--v''  or  ''--exitcode-v'' to see details about the performed checks.&lt;br /&gt;
&lt;br /&gt;
:Functionality implemented experimental, may change in future.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-v======&lt;br /&gt;
:Print information about persormed checks.&lt;br /&gt;
&lt;br /&gt;
======--exitcode-quiet======&lt;br /&gt;
:Do not print status code at end.&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-checks======&lt;br /&gt;
:Do not count checks with result 'no' for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-low  --exitcode-no-weak  --exitcode-no-medium======&lt;br /&gt;
:Do not count &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WEAK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;MEDIUM&amp;lt;/code&amp;gt; security ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-ciphers======&lt;br /&gt;
:Do not count any ciphers for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --exitcode-no-pfs======&lt;br /&gt;
:Do not count ciphers without PFS for  ''--exitcode'' .&lt;br /&gt;
&lt;br /&gt;
====== --openssl-s_client --s_client======&lt;br /&gt;
&lt;br /&gt;
:   Use  &amp;lt;code&amp;gt;openssl s_slient ...&amp;lt;/code&amp;gt; call to retrieve more informations from&lt;br /&gt;
:   the SSL connection.  This is disabled by default on Windows because&lt;br /&gt;
:   of performance problems. Without this option (default on Windows !)&lt;br /&gt;
:   following informations are missing:&lt;br /&gt;
       compression, expansion, renegotiation, resumption,&lt;br /&gt;
       selfsigned, verify, chain, protocols, DH parameters&lt;br /&gt;
:   See ''Net::SSLinfo'' for details.&lt;br /&gt;
&lt;br /&gt;
:   If used together with ''--trace'', s_client data will also be printed&lt;br /&gt;
:   in debug output of ''Net::SSLinfo''.&lt;br /&gt;
&lt;br /&gt;
====== --no-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Do not use external &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; tool to retrieve informations. Use of&lt;br /&gt;
:   &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; is disabled by default on Windows.&lt;br /&gt;
:   Note that this results in some missing informations, see above.&lt;br /&gt;
&lt;br /&gt;
====== --openssl=TOOL======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;      can be a path to openssl executable;  default: openssl&lt;br /&gt;
&lt;br /&gt;
====== --openssl-cnf=FILE --openssl-conf=FILE======&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;        path of directory or full path of openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:If set, environment variable OPENSSL_CONF will be set to given path&lt;br /&gt;
:(or file) when ''openssl(1)'' is started. Please see openssl's man page&lt;br /&gt;
:for details about specifying alternate  openssl.cnf  files.&lt;br /&gt;
&lt;br /&gt;
====== --openssl-ciphers --force-openssl======&lt;br /&gt;
&lt;br /&gt;
:   Use openssl to check for supported ciphers;  default: IO::Socket&lt;br /&gt;
&lt;br /&gt;
:   This option forces to use  &amp;lt;code&amp;gt;openssl s_slient -connect CIPHER ..&amp;lt;/code&amp;gt; to&lt;br /&gt;
:   check if a cipher is supported by the remote target. This is useful&lt;br /&gt;
:   if the ''--lib=PATH'' option doesn't work (for example due to changes&lt;br /&gt;
:   of the API or other incompatibilities).&lt;br /&gt;
&lt;br /&gt;
====== --exe-path=PATH --exe=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find openssl.&lt;br /&gt;
&lt;br /&gt;
====== --lib-path=PATH --lib=PATH======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;      is a full path where to find libssl.so and libcrypto.so&lt;br /&gt;
&lt;br /&gt;
:   See [[#HACKER's INFO|HACKER's INFO]] below for a detailed description how it works.&lt;br /&gt;
&lt;br /&gt;
====== --envlibvar=NAME======&lt;br /&gt;
&lt;br /&gt;
:   &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of a environment variable containing additional&lt;br /&gt;
:   paths for searching dynamic shared libraries.&lt;br /&gt;
:   Default is LD_LIBRARY_PATH .&lt;br /&gt;
&lt;br /&gt;
:   Check your system for the proper name, i.e.:&lt;br /&gt;
:       DYLD_LIBRARY_PATH, LIBPATH, RPATH, SHLIB_PATH .&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error======                                                                       &lt;br /&gt;
: The connection to  a target may fail, or even block, due to various  &lt;br /&gt;
: reasons, for example lost network at all, blocking at firewall, etc.  &lt;br /&gt;
: In particular when checking ciphers with  [[++cipher|+cipher]] , this may result  &lt;br /&gt;
: in long delays until results are printed.                            &lt;br /&gt;
: Using this option stops trying to do more connections to the target  &lt;br /&gt;
: when  [[#--ssl-error-max=CNT|--ssl-error-max=CNT]]  consecutive errors occoured, or if the total  &lt;br /&gt;
: amount of errors increases  [[#--ssl-error-total=CNT|--ssl-error-total=CNT]].&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-max=CNT======&lt;br /&gt;
: Max. amount of consecutive errors (default: 5).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-timeout=SEC======&lt;br /&gt;
: Timeout in seconds when a failed connection is treated as error and  &lt;br /&gt;
: then counted (default: 1).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-error-total=CNT======&lt;br /&gt;
: Max. total amount of errors (default: 10).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-lazy======&lt;br /&gt;
&lt;br /&gt;
:   I.g. this tools tries to identify available functionality according&lt;br /&gt;
:   SSL versions from the underlaying libraries.  Unsupported  versions&lt;br /&gt;
:   are then disables and a warning is shown.&lt;br /&gt;
:   Unfortunately some libraries have  not implemented all functions to&lt;br /&gt;
:   check availability of a specific SSL version, which then results in&lt;br /&gt;
:   a compile error. &lt;br /&gt;
&lt;br /&gt;
:   This option disables the strict check of availability.&lt;br /&gt;
:   If the underlaying library doesn't support the required SSL version&lt;br /&gt;
:   at all, following error may occour:&lt;br /&gt;
       Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
====== --timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Timeout in seconds when connecting to the target (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== -v======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
====== -V======&lt;br /&gt;
&lt;br /&gt;
:  Print list of ciphers in style like: &amp;lt;code&amp;gt;openssl ciphers -V&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  Option used with  ''+ciphers''  command only.&lt;br /&gt;
&lt;br /&gt;
===== Options for SSL connection to target=====&lt;br /&gt;
====== --cipher=CIPHER======&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt;    can be any string accepeted by openssl or following:&lt;br /&gt;
* &amp;lt;code&amp;gt;yeast&amp;lt;/code&amp;gt;     use all ciphers from list defined herein, see ''+list''&lt;br /&gt;
&lt;br /&gt;
:  Beside the cipher names accepted by openssl, CIPHER can be the name&lt;br /&gt;
:  of the constant or the (hex) value as defined in openssl's files.&lt;br /&gt;
:  Currently supported are the names and constants of openssl 1.0.1k .&lt;br /&gt;
:  Example:&lt;br /&gt;
* --cipher=DHE_DSS_WITH_RC4_128_SHA&lt;br /&gt;
* --cipher=0x03000066&lt;br /&gt;
* --cipher=66&lt;br /&gt;
:  will be mapped to   DHE-DSS-RC4-SHA&lt;br /&gt;
&lt;br /&gt;
:  Note: if more than one cipher matches, just one will be selected.&lt;br /&gt;
:&lt;br /&gt;
:  Default is &amp;lt;code&amp;gt;ALL:NULL:eNULL:aNULL:LOW&amp;lt;/code&amp;gt; as specified in Net::SSLinfo&lt;br /&gt;
&lt;br /&gt;
====== --socket-reuse======&lt;br /&gt;
: TCP socket will be reused for  next connection attempt  even if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
====== --no-socket-reuse======&lt;br /&gt;
: Close TCP socket and then reopen for next connection attempt if SSL&lt;br /&gt;
: connection failed.&lt;br /&gt;
&lt;br /&gt;
: This is useful for some servers which may return an &amp;quot;TLS alert&amp;quot;  if&lt;br /&gt;
: the connection fails and then fail again on the same socket.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-connect======&lt;br /&gt;
&lt;br /&gt;
:  A simple check if the target can be connected  will be performed by&lt;br /&gt;
:  default.  If this check fails, the target will be ignored, means no&lt;br /&gt;
:  more reuqested checks will be done.  As this connection check some-&lt;br /&gt;
:  times fails due to various reasons, the check can be disabled using&lt;br /&gt;
:  this option.&lt;br /&gt;
&lt;br /&gt;
====== --no-md5-cipher======&lt;br /&gt;
:Do not use *-MD5 ciphers for other protocols than SSLv2.&lt;br /&gt;
:This option is only effective with  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
:The purpose is to avoid warnings from  IO::Socket::SSL(3pm)  like:&lt;br /&gt;
         Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.&lt;br /&gt;
:which occours with some versions of  IO::Socket::SSL(3pm)  when a&lt;br /&gt;
:*-MD5  ciphers will be used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Note that these ciphers will be checked for SSLv2 only.&lt;br /&gt;
&lt;br /&gt;
====== --SSL, -protocol SSL======&lt;br /&gt;
&lt;br /&gt;
====== --no-SSL======&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;       can be any of:&lt;br /&gt;
:ssl, ssl2, ssl3, sslv2, sslv3, tls1,&lt;br /&gt;
:tls1, tls11, tls1.1, tls1-1, tlsv1, tlsv11, tlsv1.1, tlsv1-1&lt;br /&gt;
:(and similar variants for tlsv1.2).&lt;br /&gt;
:For example  ''--tls1''  ''--tlsv1''  ''--tlsv1_1''  are all the same.&lt;br /&gt;
&lt;br /&gt;
:  (''--SSL'' variants):    Test ciphers for this SSL/TLS version.&lt;br /&gt;
:  (''--no-SSL'' variants): Don't test ciphers for this SSL/TLS version.&lt;br /&gt;
&lt;br /&gt;
====== --no-tcp======&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-sslv2 --no-sslv3 --no-tlsv1 --no-tlsv11 --no-tlsv12 --no-tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --tcp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--sslv2 --sslv3 --tlsv1 --tlsv11 --tlsv12 --tlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --no-udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:&lt;br /&gt;
:''--no-dtlsv09 --no-dtlsv1 --no-dtlsv11 --no-dtlsv12 --no-dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --udp======&lt;br /&gt;
&lt;br /&gt;
:Shortcut for:  ''--dtlsv09 --dtlsv1 --dtlsv11 --dtlsv12 --dtlsv13''&lt;br /&gt;
&lt;br /&gt;
====== --nullsslv2======&lt;br /&gt;
:  This option  forces  to assume that  SSLv2  is enabled  even if the&lt;br /&gt;
:  target does not accept any ciphers.&lt;br /&gt;
&lt;br /&gt;
:  The target server may accept connections with  SSLv2  but not allow&lt;br /&gt;
:  any cipher. Some checks verify if  SSLv2  is enabled at all,  which&lt;br /&gt;
:  then would result in a failed test.&lt;br /&gt;
:  The default behaviour is to assume that  SSLv2 is not enabled if no&lt;br /&gt;
:  ciphers are accepted.&lt;br /&gt;
:&lt;br /&gt;
====== --http======&lt;br /&gt;
&lt;br /&gt;
:  Make a HTTP request if cipher is supported.&lt;br /&gt;
&lt;br /&gt;
:  If used twice debugging will be enabled using  environment variable&lt;br /&gt;
:  &amp;lt;code&amp;gt;HTTPS_DEBUG&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --no-http======&lt;br /&gt;
:&lt;br /&gt;
:  Do not make HTTP request.&lt;br /&gt;
:&lt;br /&gt;
====== --sni======&lt;br /&gt;
:&lt;br /&gt;
:  Make SSL connection in SNI mode.&lt;br /&gt;
:&lt;br /&gt;
====== --no-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not make SSL connection in SNI mode (default: SNI mode).&lt;br /&gt;
&lt;br /&gt;
====== --sni-toggle --toggle-sni ======&lt;br /&gt;
&lt;br /&gt;
: Test with and witout SNI mode (''+cipherall''  only).&lt;br /&gt;
&lt;br /&gt;
====== --force-sni======&lt;br /&gt;
&lt;br /&gt;
:  Do not check if SNI seems to be supported by ''Net::SSLeay(1)''.&lt;br /&gt;
:  Older versions of openssl and its libries do not support SNI or the&lt;br /&gt;
:  SNI support is implemented buggy. By default it's checked if SNI is&lt;br /&gt;
:  properly supported. With this option this check can be disabled.&lt;br /&gt;
&lt;br /&gt;
:  Be warned that this may result in improper results.&lt;br /&gt;
&lt;br /&gt;
====== --servername=NAME======&lt;br /&gt;
====== --sni-name=NAME======&lt;br /&gt;
: If in SNI mode is active, see  ''--sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used instead of&lt;br /&gt;
: hostname for connections to the target. If SNI mode is not active,&lt;br /&gt;
: see  ''--no-sni''  above, &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is not used. The default is undefined,&lt;br /&gt;
: which forces to use the given FQDN.&lt;br /&gt;
&lt;br /&gt;
: This is useful, for example when an IP instead of a FQDN was given,&lt;br /&gt;
: where a correct hostname (i.g. a FQDN) needs to be specified.&lt;br /&gt;
&lt;br /&gt;
: Note: i.g. there is no need to use this option,  as a correct value&lt;br /&gt;
: for the SNI name will be choosen automatically (except for IPs).&lt;br /&gt;
: However, it is kind of fuzzing ...even setting to an  empty string&lt;br /&gt;
: is possible.&lt;br /&gt;
                                                                               &lt;br /&gt;
: Limitation: the same &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; is used for all targets, if more than&lt;br /&gt;
: one  target was specified.&lt;br /&gt;
&lt;br /&gt;
====== --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return empty string.&lt;br /&gt;
:&lt;br /&gt;
====== --no-cert --no-cert======&lt;br /&gt;
:&lt;br /&gt;
:  Do not get data from target's certificate, return default string&lt;br /&gt;
:  of ''Net::SSLinfo'' (see  ''--no-cert-text TEXT''  option).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-cert-text=TEXT======&lt;br /&gt;
:&lt;br /&gt;
:  Set  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;  to be returned from  &amp;lt;code&amp;gt;Net::SSLinfo.pm&amp;lt;/code&amp;gt; if no certificate&lt;br /&gt;
:  data is collected due to use of  ''--no-cert''.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-depth=INT======&lt;br /&gt;
:&lt;br /&gt;
:  Check certificate chain to depth  &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; (like openssl's -verify).&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-file=FILE======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;  with bundle of CAs to verify target's certificate chain.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --ca-path=DIR======&lt;br /&gt;
:&lt;br /&gt;
:  Use  &amp;lt;code&amp;gt;DIR&amp;lt;/code&amp;gt;  where to find CA certificates in PEM format.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --no-nextprotoneg======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --proto-alpn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-alpn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --proto-npn=NAME======&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for any connection to the targets.&lt;br /&gt;
:    See  ''--cipher-npn=NAME''  also.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-compression --compression======&lt;br /&gt;
:  Use SSL option &amp;quot;compression&amp;quot; for connection.&lt;br /&gt;
&lt;br /&gt;
====== --no-ssl-compression --no-compression======&lt;br /&gt;
:  Use SSL option &amp;quot;no compression&amp;quot; for connection (default: don't use)&lt;br /&gt;
&lt;br /&gt;
====== --no-reconnect======&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-reconnect&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
&lt;br /&gt;
====== --no-tlsextdebug======&lt;br /&gt;
:&lt;br /&gt;
:  Do not use  &amp;lt;code&amp;gt;-tlsextdebug&amp;lt;/code&amp;gt;  option for openssl.&lt;br /&gt;
:&lt;br /&gt;
====== --sclient-opt=VALUE======&lt;br /&gt;
:&lt;br /&gt;
:  Argument or option passed to openssl s_client command.&lt;br /&gt;
:&lt;br /&gt;
===== Options for ''+cipher''  command =====&lt;br /&gt;
&lt;br /&gt;
====== --cipher-alpn=NAME====== &lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  applcation layer protocols&lt;br /&gt;
:    (ALPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-alpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-alpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====== --cipher-npn=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of protocol to be added to list of  next protocol negotiations&lt;br /&gt;
:    (NPN), which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-lpn=,''   sets empty list.&lt;br /&gt;
:*    ''--cipher-lpn=,,''  sets list to empty element &amp;quot;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with&lt;br /&gt;
:    openssl executable (i.e.  --force-openssl).&lt;br /&gt;
&lt;br /&gt;
====== --cipher-curve=NAME======&lt;br /&gt;
&lt;br /&gt;
:    Name of ecliptic curve to be added to list of ecliptic curves (EC),&lt;br /&gt;
:    which is used for cipher checks.&lt;br /&gt;
&lt;br /&gt;
:*    ''--cipher-curve=,''   sets empty list. &lt;br /&gt;
:*    ''--cipher-curve=,,''  sets list to empty element &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:    Note:  setting empty list or element most likely does not work with &lt;br /&gt;
:    openssl executable (i.e.  ''--force-openssl'').&lt;br /&gt;
&lt;br /&gt;
===== Options for cipherall  and cipherraw  command =====&lt;br /&gt;
&lt;br /&gt;
====== --range=RANGE ======&lt;br /&gt;
====== --cipherrange=RANGE======&lt;br /&gt;
&lt;br /&gt;
:  Specify range of cipher constants to be tested by  ''+cipherall'' .&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;RANGE&amp;lt;/code&amp;gt;s are supported (see also [[#--cipherrange=RANGE|--cipherrange=RANGE]]):&lt;br /&gt;
*  &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;             all ciphers defined in various RFCs&lt;br /&gt;
*  &amp;lt;code&amp;gt;shifted&amp;lt;/code&amp;gt;         &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt;, shifted by 64 bytes to the right&lt;br /&gt;
*  &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;            like &amp;lt;code&amp;gt;rfc&amp;lt;/code&amp;gt; but more lazy list of &lt;br /&gt;
*  &amp;lt;code&amp;gt;huge&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x032FFFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;full&amp;lt;/code&amp;gt;            all constants  0x03000000 .. 0x0300FFFF&lt;br /&gt;
*  &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt;           all ciphers according RFC for SSLv2&lt;br /&gt;
&lt;br /&gt;
:Note: &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; is the internal list used for testing SSLv2 ciphers.&lt;br /&gt;
:It does not make sense to use it for other protocols; however ...&lt;br /&gt;
&lt;br /&gt;
====== --slow-server-delay=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Additional delay in seconds  after the server is connected  using a&lt;br /&gt;
:  proxy or before starting STARTTLS.&lt;br /&gt;
:  This is useful when connecting via  slow proxy chains or connecting&lt;br /&gt;
:  to slow servers before sending the STARTTLS sequence.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-maxciphers=CNT ======&lt;br /&gt;
&lt;br /&gt;
:  Maximal number of ciphers sent in a sslhello (default: 32).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-double-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Send SSL extension  &amp;quot;reneg_info&amp;quot;  even if list of ciphers includes&lt;br /&gt;
:  TLS_EMPTY_RENEGOTIATION_INFO_SCSV (default: do not include)&lt;br /&gt;
&lt;br /&gt;
====== --ssl-nodata-nocipher======&lt;br /&gt;
&lt;br /&gt;
:  Do not abort testing for next cipher when the target  responds with&lt;br /&gt;
:  &amp;quot;NoData&amp;quot; times out. Useful for TLS intolerant servers.&lt;br /&gt;
:  By default testing for ciphers is aborted  when the target responds&lt;br /&gt;
:  with &amp;quot;noData message.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ecc======&lt;br /&gt;
&lt;br /&gt;
:  Use supported elliptic curves.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-ec-point======&lt;br /&gt;
&lt;br /&gt;
:  Use TLS &amp;quot;ec_point_formats&amp;quot; extension.  Default on.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-use-reneg======&lt;br /&gt;
&lt;br /&gt;
:  Test for ciphers with &amp;quot;secure renegotiation&amp;quot; flag set.&lt;br /&gt;
:  Default: don't set &amp;quot;secure renegotiation&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
====== --ssl-retry=CNT======&lt;br /&gt;
&lt;br /&gt;
:  Number of retries when connection timed-out (default: 2).&lt;br /&gt;
&lt;br /&gt;
====== --ssl-timeout=SEC======&lt;br /&gt;
&lt;br /&gt;
:  Number of seconds to wait until connection is qualified as timeout.&lt;br /&gt;
&lt;br /&gt;
====== --dns-mx, --mx======&lt;br /&gt;
&lt;br /&gt;
:  Get DNS MX records for given target and check the returned targets.&lt;br /&gt;
:  (only useful with  ''--starttls=SMTP'')&lt;br /&gt;
&lt;br /&gt;
===== Options for checks and results=====&lt;br /&gt;
:&lt;br /&gt;
:Options used for  ''+check''  command:&lt;br /&gt;
:&lt;br /&gt;
====== --enabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --disabled======&lt;br /&gt;
:&lt;br /&gt;
:  Only print result for ciphers not accepted by target.&lt;br /&gt;
:&lt;br /&gt;
====== --ignorecase======&lt;br /&gt;
:&lt;br /&gt;
:  Checks are done case insensitive.&lt;br /&gt;
:&lt;br /&gt;
====== --no-ignorecase======&lt;br /&gt;
&lt;br /&gt;
:  Checks are done case sensitive. Default: case insensitive.&lt;br /&gt;
:  Currently only checks according CN, alternate names in the target's&lt;br /&gt;
:  certificate compared to the given hostname are effected.&lt;br /&gt;
&lt;br /&gt;
====== --ignore-no-reply======&lt;br /&gt;
&lt;br /&gt;
:When checking for the TLS &amp;quot;heartbeat&amp;quot; extension,  the server may not&lt;br /&gt;
:respond at all, which would result in a  &amp;quot;no reply&amp;quot;  message.  This&lt;br /&gt;
:marks the check for  ''+heartbleed''  as &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;.&lt;br /&gt;
:I.g.  a server is  not vulnerable to the  heartbleed attack  if the&lt;br /&gt;
:TLS &amp;quot;heartbeat&amp;quot; extension is disabled. Hence the check result  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:may be mis-leading.  This option  treats the  &amp;quot;no reply&amp;quot;  result as&lt;br /&gt;
:&amp;quot;not vulnerable&amp;quot; and returns  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  then.&lt;br /&gt;
&lt;br /&gt;
:Note: if the server does not respond for this check,  does not mean&lt;br /&gt;
:that the &amp;quot;heartbeat&amp;quot; extension is switched off.  If unsure, disable&lt;br /&gt;
:this lazy check with  ''--no-ignore-no-reply'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for output format=====&lt;br /&gt;
:&lt;br /&gt;
====== --label=TYPE======&lt;br /&gt;
&lt;br /&gt;
:  Defines the format of the descriptive text(label) for  ''+check''   and&lt;br /&gt;
:  ''+info'' command.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
====== --label=long======&lt;br /&gt;
:Prints full text for labels:&lt;br /&gt;
  Certificate Common Name:  some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=short======&lt;br /&gt;
:Prints short less descriptive text for labels:&lt;br /&gt;
  Common Name:              some.tld&lt;br /&gt;
&lt;br /&gt;
====== --label=key======&lt;br /&gt;
:Internal format: print name of key instead of text as label. Key is&lt;br /&gt;
:Prints name of key instead of text as label. The key is that of the&lt;br /&gt;
:internal data structure(s).&lt;br /&gt;
&lt;br /&gt;
  [cn]                      some.tld&lt;br /&gt;
&lt;br /&gt;
====== --legacy=TOOL======&lt;br /&gt;
&lt;br /&gt;
:  For compatibility with other tools,  the output format used for the&lt;br /&gt;
:  result of the ''+cipher'' command can be adjusted to mimic the format&lt;br /&gt;
:  of other SSL testing tools.&lt;br /&gt;
&lt;br /&gt;
:  The argument to the ''--legacy=TOOL''  option is the name of the tool&lt;br /&gt;
:  to be simulated.&lt;br /&gt;
&lt;br /&gt;
:  Following &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;s are supported:&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslaudit&amp;lt;/code&amp;gt;        format of output similar to  sslaudit&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslcipher&amp;lt;/code&amp;gt;       format of output similar to  ssl-cipher-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssldiagnos&amp;lt;/code&amp;gt;      format of output similar to  ssldiagnos&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslscan&amp;lt;/code&amp;gt;         format of output similar to  sslscan&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest&amp;lt;/code&amp;gt;         format of output similar to  ssltest&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltestg&amp;lt;/code&amp;gt;        format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssltest-g&amp;lt;/code&amp;gt;       format of output similar to  ssltest -g&lt;br /&gt;
*  &amp;lt;code&amp;gt;sslyze&amp;lt;/code&amp;gt;          format of output similar to  sslyze&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cipher-check&amp;lt;/code&amp;gt;      same as sslcipher&lt;br /&gt;
*  &amp;lt;code&amp;gt;ssl-cert-check&amp;lt;/code&amp;gt;  format of output similar to  ssl-cert-check&lt;br /&gt;
*  &amp;lt;code&amp;gt;testsslserver&amp;lt;/code&amp;gt;   format of output similar to  TestSSLServer.jar&lt;br /&gt;
* &amp;lt;code&amp;gt; thcsslcHeck&amp;lt;/code&amp;gt;     format of output similar to  THCSSLCheck&lt;br /&gt;
&lt;br /&gt;
:  Note that these legacy formats only apply to  output of the checked&lt;br /&gt;
:  ciphers. Other texts like headers and footers are adapted slightly.&lt;br /&gt;
&lt;br /&gt;
:  Please do not expect identical output as the &amp;lt;code&amp;gt;TOOL&amp;lt;/code&amp;gt;  when using these&lt;br /&gt;
:  options, it's a best guess and should be parsable in a very similar&lt;br /&gt;
:  way.&lt;br /&gt;
&lt;br /&gt;
======--legacy=TYPE======&lt;br /&gt;
======--legacy=compact======&lt;br /&gt;
&lt;br /&gt;
:Internal format: mainly avoid tabs and spaces format is as follows:&lt;br /&gt;
 Some Label:&amp;lt;-- anything right of colon is data&lt;br /&gt;
&lt;br /&gt;
======--legacy=full======&lt;br /&gt;
&lt;br /&gt;
:Internal format: pretty print each label in its own line,  followed&lt;br /&gt;
:by data prepended by tab character (useful for  ''+info''  only).&lt;br /&gt;
&lt;br /&gt;
====== --legacy=owasp======&lt;br /&gt;
&lt;br /&gt;
:Results for cipher checks use rating from OWASP Cipher Cheat Sheet.&lt;br /&gt;
&lt;br /&gt;
======--legacy=quick======&lt;br /&gt;
&lt;br /&gt;
:Internal format: use tab as separator; ciphers are printed with bit&lt;br /&gt;
:length (implies ''--tab'').&lt;br /&gt;
&lt;br /&gt;
======--legacy=simple======&lt;br /&gt;
&lt;br /&gt;
:Internal default format.&lt;br /&gt;
&lt;br /&gt;
====== --format=FORM======&lt;br /&gt;
:This option is used to specify the format of the result lines. This&lt;br /&gt;
:covers the value of the result line only.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;    Print raw data as passed from ''Net::SSLinfo'' .&lt;br /&gt;
&lt;br /&gt;
:    Note:  all data will be printed as is,  without additional label&lt;br /&gt;
:    or formatting. It's recommended to use the option in conjunction&lt;br /&gt;
:    with exactly one command.  Otherwise the user needs  to know how&lt;br /&gt;
:    to &amp;quot;read&amp;quot;  the printed data.&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;code&amp;gt;hex&amp;lt;/code&amp;gt;    Convert some data to hex: 2 bytes separated by &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
*  &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; and separated by a space.&lt;br /&gt;
*  &amp;lt;code&amp;gt;/x&amp;lt;/code&amp;gt;     Same as  ''--format=\x''&lt;br /&gt;
*  &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt;     Convert some data with hex values:&lt;br /&gt;
:                           2 bytes preceded by &amp;lt;code&amp;gt;\x&amp;lt;/code&amp;gt; and no separating char.&lt;br /&gt;
&lt;br /&gt;
====== --header======&lt;br /&gt;
:&lt;br /&gt;
:  Print formatting header.  Default for  ''+check'', ''+info'', ''+quick''.&lt;br /&gt;
:  and  ''+cipher''  only.&lt;br /&gt;
:&lt;br /&gt;
====== --no-header======&lt;br /&gt;
:  Do not print formatting header.&lt;br /&gt;
:  Usefull if raw output should be passed to other programs.&lt;br /&gt;
&lt;br /&gt;
:   Note: must be used on command line to inhibit all header lines.&lt;br /&gt;
&lt;br /&gt;
======--ignore-cmd=CMD======&lt;br /&gt;
======--ignore-output=CMD======&lt;br /&gt;
======--no-cmd=CMD======&lt;br /&gt;
======--no-output=CMD======&lt;br /&gt;
:Do not print output (data or check result) for command &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; is any valid command, see  [[#COMMANDS|COMMANDS]],  without leading &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:Option can be used multiple times.&lt;br /&gt;
&lt;br /&gt;
====== --score======&lt;br /&gt;
:&lt;br /&gt;
:  Print scoring results. Default for  ''+check''.&lt;br /&gt;
:&lt;br /&gt;
====== --no-score======&lt;br /&gt;
:&lt;br /&gt;
:  Do not print scoring results.&lt;br /&gt;
:&lt;br /&gt;
====== --separator=CHAR======&lt;br /&gt;
:&lt;br /&gt;
====== --sep=CHAR======&lt;br /&gt;
:&lt;br /&gt;
:  &amp;lt;code&amp;gt;CHAR&amp;lt;/code&amp;gt;      will be used as separator between  label and value of the&lt;br /&gt;
:      printed results. Default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --tab======&lt;br /&gt;
&lt;br /&gt;
:  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt; character (0x09, \t)  will be used  as separator between  label&lt;br /&gt;
:      and value of the printed results.&lt;br /&gt;
:  As label and value are already separated by a  &amp;lt;code&amp;gt;TAB&amp;lt;/code&amp;gt;  character, this&lt;br /&gt;
:  options is only useful in conjunction with the   ''--legacy=compact''&lt;br /&gt;
:  option.&lt;br /&gt;
&lt;br /&gt;
====== --showhost======&lt;br /&gt;
&lt;br /&gt;
:  Prefix each printed line with the given hostname (target).&lt;br /&gt;
:  The hostname will be followed by the separator character.&lt;br /&gt;
&lt;br /&gt;
======--std-format=utf8======                                                  &lt;br /&gt;
======--std-format=crlf======&lt;br /&gt;
&lt;br /&gt;
======--std-format=raw======                                                   &lt;br /&gt;
======--std-format=unix======                                                  &lt;br /&gt;
======--std-format=CHARSET======                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:This option is used to specify the general output format for STDOUT           &lt;br /&gt;
:and STDERR. All results are written to STDOUT,  errors and warnings           &lt;br /&gt;
:may also be written to STDERR .  The default is &amp;lt;code&amp;gt;:unix:utf8&amp;lt;/code&amp;gt;, which&lt;br /&gt;
:is the perlish definition used internally.                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:Following values are supported:                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;                                                            &lt;br /&gt;
:* &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;      Print raw data, binary in bytes without conversion.  &lt;br /&gt;
:Note:  binary here just means characters (as all output is text).             &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;      Convert all characters to UTF-8.                     &lt;br /&gt;
:* &amp;lt;code&amp;gt;crlf&amp;lt;/code&amp;gt;      Use CR LF as end of line.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:* &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;CHARSET&amp;lt;/code&amp;gt; can be any of the local installed character&lt;br /&gt;
:sets, like UTF-8, UTF-16LE, CP1252, iso-8859-7, etc..                         &lt;br /&gt;
:This conversion may print its own warnings.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:The option can be used multiple times with different values.                  &lt;br /&gt;
:To reset the  default behaviour, either  &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;unix&amp;lt;/code&amp;gt;  must be&lt;br /&gt;
:used. Obviously, they must be used first. All other values are used           &lt;br /&gt;
:additionally.                                                                 &lt;br /&gt;
:Note:  &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt; just defines the format of the characters, it does no&lt;br /&gt;
:further checks on the converted characters. In contrast, &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; is&lt;br /&gt;
:used as real encoding and does some checks.                                   &lt;br /&gt;
&lt;br /&gt;
:For more details, please see  &amp;quot;perldoc -f binmode&amp;quot; .&lt;br /&gt;
                                                                  &lt;br /&gt;
:Currently (Jan. 2018), these options must be used before any ''--help''       &lt;br /&gt;
:option.&lt;br /&gt;
&lt;br /&gt;
====== --win-CR======&lt;br /&gt;
&lt;br /&gt;
:Obsolete, please use  ''--std-format=crlf'' .&lt;br /&gt;
&lt;br /&gt;
===== Options for compatibility with other programs=====&lt;br /&gt;
&lt;br /&gt;
:Please see other programs for detailed description (if not obvious:).&lt;br /&gt;
:Note that often only the long form options are accepted  as most short&lt;br /&gt;
:form options are ambiguous.&lt;br /&gt;
:If other programs use the same option,but with a different behaviour,  &lt;br /&gt;
:then thes other options are not supported.                             &lt;br /&gt;
:For a list of supported options, please see:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
: Following list contains only those options not shown with:&lt;br /&gt;
  o-saft.pl --help=alias&lt;br /&gt;
&lt;br /&gt;
 Tool's Option        (Tool)          o-saft.pl Option&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
  --checks CMD        (TLS-Check.pl)  same as ''+CMD''&lt;br /&gt;
  -h, -h=HOST         (various tools) same as ''--host HOST''&lt;br /&gt;
  -p, -p=PORT         (various tools) same as ''--port PORT''&lt;br /&gt;
  -t HOST             (ssldiagnos)    same as ''--host HOST''&lt;br /&gt;
  --protocol SSL      (ssldiagnos)    same as ''--SSL''&lt;br /&gt;
  --UDP               (ssldiagnos)    same as ''--udp''&lt;br /&gt;
  --insecure          (cnark.pl)      ignored&lt;br /&gt;
  --nopct --nocolor   (ssldiagnos)    ignored&lt;br /&gt;
  --timeout, --grep   (ssltest.pl)    ignored&lt;br /&gt;
  -r,  -s,  -t,  -x   (ssltest.pl)    ignored&lt;br /&gt;
  -connect, -H, -u, -url, -U          ignored&lt;br /&gt;
  -noSSL                              same as ''--no-SSL''&lt;br /&gt;
  -no_SSL                             same as ''--no-SSL''&lt;br /&gt;
 --------------------+---------------+---------------------------&lt;br /&gt;
&lt;br /&gt;
:  For definition of  &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt;  see  ''--SSL''  and  ''--no-SSL''  above.&lt;br /&gt;
&lt;br /&gt;
===== Options for customization=====&lt;br /&gt;
:&lt;br /&gt;
:  For general descriptions please see  [[#CUSTOMIZATION|CUSTOMIZATION]]  section below.&lt;br /&gt;
:&lt;br /&gt;
====== --cfg_cmd=CMD=LIST======&lt;br /&gt;
&lt;br /&gt;
:  Redefine list of commands. Sets  %cfg{cmd-CMD}  to &amp;lt;code&amp;gt; LIST&amp;lt;/code&amp;gt;.  Commands&lt;br /&gt;
:  can be written without the leading  &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is any of the known internal commands, it will be redifned.&lt;br /&gt;
:  If  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  is a unknown command, it will be created.&lt;br /&gt;
&lt;br /&gt;
:  Example:&lt;br /&gt;
    ''--cfg_cmd=sni=sni hostname''&lt;br /&gt;
&lt;br /&gt;
:  To get a list of commands and their settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=intern&lt;br /&gt;
&lt;br /&gt;
:  Main purpose is to reduce list of commands or to print them sorted.&lt;br /&gt;
:  An example  ''+preload''  can be found in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
====== --cfg_score=KEY=SCORE======&lt;br /&gt;
&lt;br /&gt;
:  Redefine value for scoring. Sets  %checks{KEY}{score}  to  SCORE.&lt;br /&gt;
:  Most score values are set to 10 by default. Values &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; .. &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; are&lt;br /&gt;
:  allowed.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of current score settings, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
:  For deatils how scoring works, please see  [[#SCORING| SCORING]]  section.&lt;br /&gt;
&lt;br /&gt;
:  Use the  ''--trace-key''  option for the  ''+info''  and/or  ''+check''&lt;br /&gt;
:  command to get the values for  KEY.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_checks=KEY=TEXT --cfg_data=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine texts used for labels in output. Sets  %data{KEY}{txt}  or&lt;br /&gt;
:  %checks{KEY}{txt}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured labels, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_checks&lt;br /&gt;
    o-saft.pl --help=cfg_data&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=CIPHER=value======&lt;br /&gt;
&lt;br /&gt;
:  Redefine the security value (i.e. HIGH) in the cipher description.&lt;br /&gt;
:  Example: &lt;br /&gt;
                                                            &lt;br /&gt;
    o-saft.pl --cfg-cipher=NULL-MD5=no-security-at-all ...&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:  Redefine general texts used in output. Sets  %text{KEY}  to  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:  To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text&lt;br /&gt;
&lt;br /&gt;
:  Note that \n, \r and \t are replaced by the corresponding character&lt;br /&gt;
:  when read from [[#RC-FILE| RC-FILE]].&lt;br /&gt;
&lt;br /&gt;
====== --cfg_text=FILE======&lt;br /&gt;
:Read definitions for  %text{KEY}=&amp;quot;my text&amp;quot; from file  &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --cfg_hint=KEY=TEXT======&lt;br /&gt;
&lt;br /&gt;
:Redefine texts used for hints. Sets  %cfg{hints}{KEY}  to &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:To get a list of preconfigured texts, use:&lt;br /&gt;
&lt;br /&gt;
    o-sat.pl --help=cfg-hint&lt;br /&gt;
&lt;br /&gt;
====== --call=METHOD======&lt;br /&gt;
:&lt;br /&gt;
:  See  [[#Options for SSL tool|Options for SSL tool]]&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --usr======&lt;br /&gt;
:&lt;br /&gt;
: Execute functions defined in  o-saft-usr.pm.&lt;br /&gt;
&lt;br /&gt;
====== --usr-*======&lt;br /&gt;
====== --user-*======&lt;br /&gt;
&lt;br /&gt;
: Options ignored, but stored as is internal in  $cfg{usr-args} .&lt;br /&gt;
: These options can be used in  o-saft-usr.pm  or  o-saft-dbx.pm.&lt;br /&gt;
&lt;br /&gt;
====== --experimental======&lt;br /&gt;
:&lt;br /&gt;
:  Use experimental functionality.&lt;br /&gt;
:  Some functionality of this tool is  under development and only used&lt;br /&gt;
:  when this option is given.&lt;br /&gt;
&lt;br /&gt;
===== Options for tracing and debugging=====&lt;br /&gt;
:&lt;br /&gt;
====== --n  --dry-run======&lt;br /&gt;
&lt;br /&gt;
:  Do not execute, just show commands (only useful in conjunction with&lt;br /&gt;
:  using openssl).&lt;br /&gt;
&lt;br /&gt;
===== Difference --trace vs. --v=====&lt;br /&gt;
&lt;br /&gt;
:While  ''--v''  is used to print more data, ''--trace'' is used to print&lt;br /&gt;
:more information about internal data such as  procedure names and/or&lt;br /&gt;
:variable names and program flow.&lt;br /&gt;
&lt;br /&gt;
====== --v======&lt;br /&gt;
====== --verbose======&lt;br /&gt;
&lt;br /&gt;
:  Print more information about checks.&lt;br /&gt;
:&lt;br /&gt;
:  Note that this option should be first otherwise some debug messages&lt;br /&gt;
:  are missing.&lt;br /&gt;
:&lt;br /&gt;
:  Note that  ''--v''  is different from  ''-v''  (see above).&lt;br /&gt;
&lt;br /&gt;
====== --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers.&lt;br /&gt;
&lt;br /&gt;
====== --v-cipher --cipher-v======&lt;br /&gt;
:Print remotely checked ciphers.&lt;br /&gt;
:In contrast to  ''--v --v''  above,  this just prints the ciphers while &lt;br /&gt;
:being checked, but no other verbose messages.&lt;br /&gt;
&amp;lt;!-- no longer implemented (8/2015)&lt;br /&gt;
====== --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print remotely checked ciphers one per line.&lt;br /&gt;
&lt;br /&gt;
====== --v --v --v --v======&lt;br /&gt;
&lt;br /&gt;
:  Print processed ciphers (check, skip, etc.).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=2&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print more debugging messages and pass &amp;lt;code&amp;gt;trace=3&amp;lt;/code&amp;gt; to Net::SSLeay and&lt;br /&gt;
:  Net::SSLinfo.&lt;br /&gt;
&lt;br /&gt;
====== --trace --trace --trace --trace======&lt;br /&gt;
&lt;br /&gt;
:  Print processing of all command line arguments.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cli======&lt;br /&gt;
:Print complete command line first. Used for internal testing.&lt;br /&gt;
&lt;br /&gt;
====== --trace--======&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace-arg======&lt;br /&gt;
&lt;br /&gt;
:  Print command line argument processing.&lt;br /&gt;
&lt;br /&gt;
====== --trace-cmd======&lt;br /&gt;
&lt;br /&gt;
:  Trace execution of command processing (those given as  ''+*'').&lt;br /&gt;
&lt;br /&gt;
====== --trace@======&lt;br /&gt;
:&lt;br /&gt;
====== --trace-key======&lt;br /&gt;
&lt;br /&gt;
:  Print some internal variable names in output texts (labels).&lt;br /&gt;
:  Variable names are prefixed to printed line and enclosed in  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; .&lt;br /&gt;
:  Example without --trace-key :&lt;br /&gt;
       Certificate Serial Number:          deadbeef&lt;br /&gt;
&lt;br /&gt;
:  Example with    --trace-key :&lt;br /&gt;
       #serial#          Certificate Serial Number:          deadbeef&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
====== --trace=VALUE======&lt;br /&gt;
:Alias for  [[#--trace=VALUE|--trace-VALUE]]  options (see above).&lt;br /&gt;
&lt;br /&gt;
:Trace Option        Alias Option&lt;br /&gt;
*  --trace=1                          same as --trace&lt;br /&gt;
*  --trace=2                          same as --trace --trace&lt;br /&gt;
*  --trace=arg                        same as --trace-arg&lt;br /&gt;
*  --trace=cmd                        same as --trace-cmd&lt;br /&gt;
*  --trace=key                        same as --trace-key&lt;br /&gt;
&lt;br /&gt;
====== --trace-time======&lt;br /&gt;
:&lt;br /&gt;
:  Prints timestamp in trace output. More timestamps are printed if  &lt;br /&gt;
:  used together with  ''--trace-cmd''.&lt;br /&gt;
&lt;br /&gt;
====== --trace=FILE======&lt;br /&gt;
&lt;br /&gt;
:  Use &amp;lt;code&amp;gt;FILE&amp;lt;/code&amp;gt; instead of the default [[#RC-FILE|RC-FILE]], i.e. &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== --trace-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; only, but not any modules.&lt;br /&gt;
&lt;br /&gt;
====== --trace-not-me======&lt;br /&gt;
&lt;br /&gt;
:Print debugging messages for modules only, but not &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; istself.&lt;br /&gt;
&lt;br /&gt;
====== --trace-sub +traceSUB======&lt;br /&gt;
&lt;br /&gt;
:  Print formatted list of internal functions with their description.&lt;br /&gt;
:  Not to be intended in conjunction with any target check.&lt;br /&gt;
&lt;br /&gt;
====== --hint======&lt;br /&gt;
:  Print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --no-hint======&lt;br /&gt;
:  Do not print hint messages (!!Hint:).&lt;br /&gt;
&lt;br /&gt;
====== --warning======&lt;br /&gt;
:  Print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --no-warning======&lt;br /&gt;
:  Do not print warning messages (**WARNING:).&lt;br /&gt;
&lt;br /&gt;
====== --exit=KEY======&lt;br /&gt;
:Terminate &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. Please see  [[#TESTING|TESTING]]  below.&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
&lt;br /&gt;
:For compatibility with other programs and lazy users, some arguments&lt;br /&gt;
:looking like options are silently taken as commands. This means that&lt;br /&gt;
:''--THIS''  becomes  ''+THIS''  then. These options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--help''&lt;br /&gt;
:*  ''--abbr''&lt;br /&gt;
:*  ''--todo''&lt;br /&gt;
:*  ''--chain''&lt;br /&gt;
:*  ''--default''&lt;br /&gt;
:*  ''--fingerprint''&lt;br /&gt;
:*  ''--list''&lt;br /&gt;
:*  ''--version''&lt;br /&gt;
&lt;br /&gt;
:Take care that this behaviour may be removed in future versions as it&lt;br /&gt;
:conflicts with those options and commands which actually exist, like:&lt;br /&gt;
&lt;br /&gt;
:*  ''--sni''  vs.  ''+sni''&lt;br /&gt;
&lt;br /&gt;
==== LAZY SYNOPSIS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Following strings are treated as a command instead of target names:&lt;br /&gt;
&lt;br /&gt;
:*  ciphers&lt;br /&gt;
:*  s_client&lt;br /&gt;
:*  version&lt;br /&gt;
&lt;br /&gt;
:A warning will be printed.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:We support following options, which are all identical, for lazy users&lt;br /&gt;
:and for compatibility with other programs.&lt;br /&gt;
&lt;br /&gt;
====== Option Variants======&lt;br /&gt;
&lt;br /&gt;
:    ''--port PORT''&lt;br /&gt;
:    ''--port=PORT''&lt;br /&gt;
&lt;br /&gt;
:This applies to most such options,  ''--port''  is just an example.&lt;br /&gt;
:When used in the [[#RC-FILE|RC-FILE]], the ''--OPTION=VALUE'' variant must be used.&lt;br /&gt;
&lt;br /&gt;
====== Option Names======&lt;br /&gt;
:&lt;br /&gt;
:Dash  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, dot &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  and/or  underscore  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  in option names are optional,&lt;br /&gt;
:all following are the same:&lt;br /&gt;
:    ''--no.dns''&lt;br /&gt;
:    ''--no-dns''&lt;br /&gt;
:    ''--no_dns''&lt;br /&gt;
:    ''--nodns''&lt;br /&gt;
:&lt;br /&gt;
:This applies to all such options, ''--no-dns'' is just an example.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Targets=====&lt;br /&gt;
:&lt;br /&gt;
:Following syntax is supported also:&lt;br /&gt;
:&lt;br /&gt;
    o-saft.pl &amp;lt;nowiki&amp;gt;http://some.tld&amp;lt;/nowiki&amp;gt; other.tld:3889/some/path?a=b&lt;br /&gt;
:&lt;br /&gt;
:Note that only the hostname and the port are used from an URL.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
===== Options vs. Commands=====&lt;br /&gt;
:&lt;br /&gt;
:See  [[#Options vs. Commands|Options vs. Commands]]  in  [[#OPTIONS|OPTIONS]]  section above&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
==== CHECKS====&lt;br /&gt;
&lt;br /&gt;
:All SSL related check performed by the tool will be described here.&lt;br /&gt;
&lt;br /&gt;
===== General Checks=====&lt;br /&gt;
&lt;br /&gt;
:Lookup the IP of the given hostname (FQDN), and then tries to reverse&lt;br /&gt;
:resolve the FQDN again.&lt;br /&gt;
&lt;br /&gt;
===== SSL Ciphers=====&lt;br /&gt;
&lt;br /&gt;
:Check which ciphers are supported by target. Please see [[#RESULTS|RESULTS]] for&lt;br /&gt;
:details of this check.&lt;br /&gt;
&lt;br /&gt;
===== SSL Connection=====&lt;br /&gt;
&lt;br /&gt;
====== heartbeat======&lt;br /&gt;
&lt;br /&gt;
:Check if &amp;quot;heartbead&amp;quot; extension is supported by target.&lt;br /&gt;
&lt;br /&gt;
====== poodle======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (SSLv3 enabled).&lt;br /&gt;
&lt;br /&gt;
====== robot======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to ROBOT attack (server offers ciphers&lt;br /&gt;
:with RSA encryption).&lt;br /&gt;
&lt;br /&gt;
====== sloth======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to SLOTH attack (server offeres RSA-MD5&lt;br /&gt;
:or ECDSA-MD5 ciphers).&lt;br /&gt;
&lt;br /&gt;
====== sweet32======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to Sweet32 attack  (server offers CBC or&lt;br /&gt;
: CBC3 or DES or 3DES ciphers).&lt;br /&gt;
&lt;br /&gt;
:Note that FIPS-140 compliance requires 3DES ciphers, hence compliant&lt;br /&gt;
:systems are then vulnerable to Sweet32 attacks.&lt;br /&gt;
&lt;br /&gt;
====== ALPN======&lt;br /&gt;
&lt;br /&gt;
:Check if target supports ALPN. Following messages are evaluated:&lt;br /&gt;
:&lt;br /&gt;
    ALPN protocol: h2-14&lt;br /&gt;
    No ALPN negotiated&lt;br /&gt;
&lt;br /&gt;
: Please see also  CHECKS [[#ALPN and NPN|ALPN and NPN]]  below.&lt;br /&gt;
&lt;br /&gt;
===== SSL Vulnerabilities=====&lt;br /&gt;
&lt;br /&gt;
====== ADH======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers for anonymous key exchange are supported: ADH|DHA .&lt;br /&gt;
:Such key exchanges can be sniffed.&lt;br /&gt;
&lt;br /&gt;
====== EDH======&lt;br /&gt;
&lt;br /&gt;
:Check if ephemeral ciphers are supported: DHE|EDH .&lt;br /&gt;
:They are necessary to support Perfect Forward Secrecy (PFS).&lt;br /&gt;
&lt;br /&gt;
====== BEAST======&lt;br /&gt;
&lt;br /&gt;
:Check if ciphers with CBC for protocol SSLv1, SSLv3 or TLSv1 are used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== CRIME======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSL-level compression.&lt;br /&gt;
&lt;br /&gt;
====== DROWN======&lt;br /&gt;
&lt;br /&gt;
:Connection is vulnerable if target supports SSLv2 (with at least one cipher).&lt;br /&gt;
&lt;br /&gt;
======FREAK======&lt;br /&gt;
&lt;br /&gt;
:Attack Against SSL/TLS to downgrade to EXPORT ciphers.&lt;br /&gt;
:Currently (2018) a simple check is used:   SSLv3 enabled and EXPORT&lt;br /&gt;
:ciphers supported by server.&lt;br /&gt;
:	See CVE-2015-0204 and https://freakattack.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEARTBLEED======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to heartbleed attack, see CVE-2014-0160&lt;br /&gt;
:and http://heartbleed.com/ .&lt;br /&gt;
&lt;br /&gt;
====== HEIST======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:There are no checks for the HEIST attack implemented, because this is&lt;br /&gt;
:an attack on TCP/IP rather than SSL/TLS on top of TCP/IP.&lt;br /&gt;
&lt;br /&gt;
====== KCI======&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
&lt;br /&gt;
:To perform a MiTM attack with Key Compromise Impersonation, the atta-&lt;br /&gt;
:cker needs to engage the victim to install and use a client certificate.&lt;br /&gt;
:This is considered a low risk and hence not tested here.&lt;br /&gt;
&lt;br /&gt;
====== Logjam======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulenerable to Logjam attack.&lt;br /&gt;
:Check if target suports  EXPORT ciphers  and/or  DH Parameter is less&lt;br /&gt;
:than 2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== Lucky 13======&lt;br /&gt;
&lt;br /&gt;
:Check if CBC ciphers are offered.&lt;br /&gt;
:NOTE the recommendation to be safe againts  Lucky 13  was to use RC4&lt;br /&gt;
:ciphers. But they are also subjetc to attacks (see below). Hence the&lt;br /&gt;
:check is only for CBC ciphers.&lt;br /&gt;
&lt;br /&gt;
====== RC4======&lt;br /&gt;
&lt;br /&gt;
:Check if RC4 ciphers are supported.&lt;br /&gt;
:They are assumed to be broken.&lt;br /&gt;
:Note that  ''+rc4''  reports the vulnerabilitiy to the RC4 Attack, while&lt;br /&gt;
:''+rc4_cipher''  simply reports if RC4 ciphers are offered.  However the&lt;br /&gt;
:the check, and hence the result, is the same.&lt;br /&gt;
&lt;br /&gt;
====== PFS======&lt;br /&gt;
&lt;br /&gt;
:Check if DHE ciphers are used. Also check if the  TLS session ticket&lt;br /&gt;
:is random or not used at all.&lt;br /&gt;
:Currently (2018) only a simple check is used: only DHE ciphers used.&lt;br /&gt;
:TLSv1.2 checks are not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== POODLE======&lt;br /&gt;
&lt;br /&gt;
:Check if target is vulnerable to POODLE attack (just check if  SSLv3&lt;br /&gt;
:is enabled).&lt;br /&gt;
&lt;br /&gt;
====== Practical Invalid Curve Attack======&lt;br /&gt;
&lt;br /&gt;
:This attack allows an attacker to read the servers private key if the&lt;br /&gt;
:server does not check properly the passed points for a ecliptic curve&lt;br /&gt;
:when EDH ciphers are used.&lt;br /&gt;
&lt;br /&gt;
:This check will not send multiple invalid points,  but only checks if&lt;br /&gt;
:the server closes the connection or responds with no matching cipher.&lt;br /&gt;
&lt;br /&gt;
====== ROBOT======&lt;br /&gt;
:Bleichebacher's Oracle attack against SSL/TLS ciphers.&lt;br /&gt;
&lt;br /&gt;
:Not implemented.&lt;br /&gt;
: https://robotattack.org/&lt;br /&gt;
&lt;br /&gt;
====== SLOTH======&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) we check for ciphers with  ECDSA, RSA-MD5.&lt;br /&gt;
:Checking the TLS extension 'tls-unique' is not yet implemented.&lt;br /&gt;
&lt;br /&gt;
====== Sweet32======&lt;br /&gt;
:Currently (2016) we check for ciphers with CBC or CBC3 or DES or 3DES.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Configuration and Support=====&lt;br /&gt;
&lt;br /&gt;
====== BEAST, BREACH, CRIME, DROWN, FREAK, Logjam, Lucky 13, POODLE, RC4, ROBOT, SLOTH, Sweet32======&lt;br /&gt;
&lt;br /&gt;
:See above.&lt;br /&gt;
&lt;br /&gt;
====== Renegotiation======&lt;br /&gt;
&lt;br /&gt;
:Check if the server allows client-side initiated renegotiation.&lt;br /&gt;
&lt;br /&gt;
====== Version rollback attacks======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
:Check if the server allows changing the protocol.&lt;br /&gt;
&lt;br /&gt;
====== DH Parameter======&lt;br /&gt;
:Check if target's DH Parameter is less 512  or  2048 bits.&lt;br /&gt;
&lt;br /&gt;
====== SSTP======&lt;br /&gt;
:Check if target supports SSTP by accepting method SSTP_DUPLEX_POST.&lt;br /&gt;
&lt;br /&gt;
:The check does not send other methods (like CONNECT) to verify if the&lt;br /&gt;
:the protocol is fully supported.&lt;br /&gt;
&lt;br /&gt;
:Supporting SSTP is considered insecure, because SSTP allows to tunnel&lt;br /&gt;
:other, probably insecure, protocols.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) Certificate=====&lt;br /&gt;
&lt;br /&gt;
====== Certificate Hashes======&lt;br /&gt;
&lt;br /&gt;
:Check that fingerprint is not MD5.&lt;br /&gt;
:Check that certificate private key signature is SHA2 or better.&lt;br /&gt;
&lt;br /&gt;
====== Root CA======&lt;br /&gt;
&lt;br /&gt;
:Provided certificate by target should not be a Root CA.&lt;br /&gt;
&lt;br /&gt;
====== Self-signed Certificate======&lt;br /&gt;
&lt;br /&gt;
:Certificate should not be self-signed.&lt;br /&gt;
&lt;br /&gt;
====== FQDN is listed in subjectAltname (RFC2818) ======      &lt;br /&gt;
&lt;br /&gt;
:The FQDN must be listed in the certificates subjectAltname.  &lt;br /&gt;
:The check command  ''+rfc_2818_names''  is based on the info command      &lt;br /&gt;
:''+verify_hostname'' . The check was added in 05/2017 because browsers&lt;br /&gt;
:started to complain if the FQDN is not part of the subjectAltname.&lt;br /&gt;
&lt;br /&gt;
====== IP in CommonName or subjectAltname (RFC6125)======&lt;br /&gt;
&lt;br /&gt;
:NOT YET IMPLEMENTED&lt;br /&gt;
&lt;br /&gt;
====== Basic Constraints======&lt;br /&gt;
&lt;br /&gt;
:Certificate extension Basic Constraints should be &amp;lt;code&amp;gt;CA:FALSE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== OCSP, CRL, CPS======&lt;br /&gt;
&lt;br /&gt;
:Certificate should contain URL for OCSP and CRL.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Private Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates signature key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key supports encryption.&lt;br /&gt;
&lt;br /&gt;
====== Public Key encyption well known======&lt;br /&gt;
&lt;br /&gt;
:Certificates public key encryption algorithm is well known.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus size======&lt;br /&gt;
&lt;br /&gt;
:Some (historic) SSL implementations are subject to buffer overflow if&lt;br /&gt;
:the key exceeds 16384 or 32768 bits. The check is against 16384 bits.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Modulus Exponent size======&lt;br /&gt;
&lt;br /&gt;
:The modulus exponent should be = 65537 as it is a prime number and an&lt;br /&gt;
:easy to calculate exponent.&lt;br /&gt;
:If the exponent is less than 65537, &amp;quot;Boradcast&amp;quot; attacks are possible.&lt;br /&gt;
&lt;br /&gt;
:However, some (mainly historic) SSL implementations may have problems&lt;br /&gt;
:to connect because they are not able to do the crypt mathematics with&lt;br /&gt;
:exponenents larger than 65536.&lt;br /&gt;
                                                                               &lt;br /&gt;
:If ecliptive curves are used, the result for these checks is always&lt;br /&gt;
:&amp;lt;code&amp;gt;no (&amp;lt;&amp;lt;N/A ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Sizes and Lengths of Certificate Settings======&lt;br /&gt;
&lt;br /&gt;
:  Serial Number &amp;lt;= 20 octets (RFC5280, 4.1.2.2.  Serial Number)&lt;br /&gt;
&lt;br /&gt;
:...&lt;br /&gt;
&lt;br /&gt;
====== DV-SSL - Domain Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Common Name &amp;lt;code&amp;gt;/CN=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt;  or &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt; field&lt;br /&gt;
* Domain name in &amp;lt;code&amp;gt;commonName&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;altname&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
====== EV-SSL - Extended Validation Certificate======&lt;br /&gt;
&lt;br /&gt;
:This check is performed according the requirements defined by the CA/&lt;br /&gt;
:Browser Forum  https://www.cabforum.org/contents.html .&lt;br /&gt;
:The Certificate must provide:&lt;br /&gt;
:*  DV - Domain Validation Certificate (see above)&lt;br /&gt;
:*  Organization name &amp;lt;code&amp;gt;/O=&amp;lt;/code&amp;gt; Cn ''subject'' field&lt;br /&gt;
:*  Organization name must be less to 64 characters&lt;br /&gt;
:*  Business Category &amp;lt;code&amp;gt;/businessCategory=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Registration Number &amp;lt;code&amp;gt;/serialNumber=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
:*  Address of Place of Business in &amp;lt;code&amp;gt;subject&amp;lt;/code&amp;gt; field&lt;br /&gt;
&lt;br /&gt;
:Required are: &amp;lt;code&amp;gt;/C=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ST=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/L=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Optional are: &amp;lt;code&amp;gt;/street=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/postalCode=&amp;lt;/code&amp;gt;&lt;br /&gt;
:*  Validation period does not exceed 27 month&lt;br /&gt;
&lt;br /&gt;
:See  [[#LIMITATIONS|LIMITATIONS]]  also.&lt;br /&gt;
&lt;br /&gt;
===== Target (server) HTTP(S) Support=====&lt;br /&gt;
====== STS header (see RFC 6797)======&lt;br /&gt;
&lt;br /&gt;
:Using STS is no perfect security.  While the very first request using&lt;br /&gt;
:http: is always prone to a MiTM attack, MiTM is possible to following&lt;br /&gt;
:requests again, if STS is not well implemented on the server.&lt;br /&gt;
:* Request with http: should be redirected to https:&lt;br /&gt;
:* Redirects should use status code 301 (even others will work)&lt;br /&gt;
:* Redirect's Location header must contain schema https:&lt;br /&gt;
:* Redirect's Location header must redirect to same FQDN&lt;br /&gt;
:* Redirect may use Refresh instead of Location header (not RFC6797)&lt;br /&gt;
:* Redirects from HTTP must not contain STS header&lt;br /&gt;
:* Answer from redirected page (HTTPS) must contain STS header&lt;br /&gt;
:* Answer from redirected page for IP must not contain STS header&lt;br /&gt;
:* STS header must contain includeSubDirectoy directive&lt;br /&gt;
:* STS header max-age should be less than 1 month&lt;br /&gt;
:* STS must not be set in http-equiv attribute of a meta TAG&lt;br /&gt;
&lt;br /&gt;
====== STS header preload attribute (''+preload'')======                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:To satisfy the requirements on  &amp;lt;code&amp;gt;https://hstspreload.appspot.com/&amp;lt;/code&amp;gt;  the  &lt;br /&gt;
:HSTS header must:                                                      &lt;br /&gt;
:* have the max-age with at least 18 weeks (10886400 seconds)         &lt;br /&gt;
:* have the includeSubDomains attribute                               &lt;br /&gt;
:* have the preload attribute                                         &lt;br /&gt;
:* redirect to https first, then to sub-domains (if redirected)       &lt;br /&gt;
:* have an HSTS header in each redirect to https.                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:Additionally, the site must have:                                      &lt;br /&gt;
:* a valid certificate                                                &lt;br /&gt;
:* serve all subdomains over https.                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:Except the last requirement,  ''+preload''  will do the checks.&lt;br /&gt;
:Note that  ''+preload''  is defined in  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;  only.&lt;br /&gt;
&lt;br /&gt;
====== Public Key Pins header======&lt;br /&gt;
&lt;br /&gt;
:TBD - to be described ...&lt;br /&gt;
&lt;br /&gt;
===== Sizes =====&lt;br /&gt;
&lt;br /&gt;
:Mainly in the certificate various counts, lengths and sizes of values&lt;br /&gt;
:are checked and reported. All commands for these checks start with&lt;br /&gt;
:&amp;lt;code&amp;gt;+cnt_&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;+len_&amp;lt;/code&amp;gt;.  Up to now, there is no  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;  value&lt;br /&gt;
:for these checks.&lt;br /&gt;
&lt;br /&gt;
:Following commands will check the value to be in  a specific range to&lt;br /&gt;
:become  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;:&lt;br /&gt;
:* +sts_maxage1d       - yes if HSTS maxage &amp;lt; 1 day&lt;br /&gt;
:* +sts_maxage1m       - yes if HSTS maxage &amp;lt; 1 month&lt;br /&gt;
:* +sts_maxage1y       - yes if HSTS maxage &amp;lt; 1 year&lt;br /&gt;
:* +sts_maxage18       - yes if HSTS maxage &amp;lt; 18 weeks (5 months)&lt;br /&gt;
:* +sts_maxagexy       - yes if HSTS maxage &amp;gt; 1 year&lt;br /&gt;
:* +modulus_exp_1      - Public Key Modulus Exponent &amp;lt;&amp;gt;1&lt;br /&gt;
:* +modulus_exp_65537  - Public Key Modulus Exponent =65537&lt;br /&gt;
:* +modulus_exp_oldssl - Public Key Modulus Exponent &amp;lt;65537&lt;br /&gt;
:* +modulus_size_oldssl - Public Key Modulus &amp;lt;16385 bits&lt;br /&gt;
&lt;br /&gt;
:For some details of these cjecks, please see the description above at&lt;br /&gt;
:    &amp;quot;Public Key Modulus Exponent size&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:The recommendations for  DH parameters (RSA and ecliptice curve)  are&lt;br /&gt;
:are checked as follows:&lt;br /&gt;
:* +dh_512             - DH Parameter &amp;gt;= 512 bits&lt;br /&gt;
:* +dh_2048            - DH Parameter &amp;gt;= 2048 bits&lt;br /&gt;
:* +ecdh_256           - DH Parameter &amp;gt;= 256 bits (ECDH)&lt;br /&gt;
:* +ecdh_512           - DH Parameter &amp;gt;= 512 bits (ECDH)&lt;br /&gt;
:Note that only one of the checks  &amp;lt;code&amp;gt;+dh_*&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;+ecdh_*&amp;lt;/code&amp;gt;  can return &lt;br /&gt;
:&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== ALPN and NPN=====&lt;br /&gt;
&lt;br /&gt;
:The commands for the checks to report  &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;, are  ''+hasalpn''&lt;br /&gt;
:and  ''+hasnpn''.&lt;br /&gt;
: &lt;br /&gt;
:Both, the Application Layer Protocol Negotiation (ALPN) and the  Next&lt;br /&gt;
:Protocol Negotiation (NPN) will be tested. The commands for that are:&lt;br /&gt;
:* +alpns&lt;br /&gt;
:* +npns&lt;br /&gt;
: &lt;br /&gt;
:Each, ALPN and NPN, is tested separately with all known protocols.&lt;br /&gt;
:The test sets only one protocol,  tries to make a connection and then&lt;br /&gt;
:checks if the protocol was accepted by the server. The collected list&lt;br /&gt;
:of protocols will be printed with the aforementioned commands, or the &lt;br /&gt;
:''+info''  command. Note the difference for the commands  ''+next_protocols''&lt;br /&gt;
:and  ''+alpns'', where  ''+next_protocols''  simply reports  what  the server &lt;br /&gt;
:itself advertises, while  ''+alpns''  reports what the server supports if&lt;br /&gt;
:asked for.&lt;br /&gt;
&lt;br /&gt;
===== Compliances=====&lt;br /&gt;
&lt;br /&gt;
:Note that it is not possible to satisfy all following compliances. Best&lt;br /&gt;
:match is: ''PSF'' and ''ISM'' and ''PCI'' and ''lazy BSI TR-02102-2''.&lt;br /&gt;
&lt;br /&gt;
:In general it is difficult to  satisfy all conditions of a compliances,&lt;br /&gt;
:and it is also difficult to check all these conditions. That's why some&lt;br /&gt;
:of the compliances checks are  not completely implemented,  for details&lt;br /&gt;
:please see blow.&lt;br /&gt;
&lt;br /&gt;
:Note that output of results of some checks is disabled in the  [[#RC-FILE|RC-FILE]]&lt;br /&gt;
:by default. A  &amp;quot;!!Hint:&amp;quot;  message will be printed, if any of these checks&lt;br /&gt;
:are used.&lt;br /&gt;
&lt;br /&gt;
:* FIPS-140&lt;br /&gt;
:* ISM&lt;br /&gt;
:* PCI&lt;br /&gt;
:* BSI TR-02102 (2016-01)&lt;br /&gt;
:* BSI TR-03116-4&lt;br /&gt;
:* RFC 2818&lt;br /&gt;
:* RFC 6125&lt;br /&gt;
:* RFC 6797&lt;br /&gt;
:* RFC 7525&lt;br /&gt;
&lt;br /&gt;
======BSI TR-02102-2 (''+tr-02102+'' ''tr-02102-'' ''+bsi'')======&lt;br /&gt;
&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-02102-2,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen&lt;br /&gt;
:/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from TR-02102-2 Version 2016-01)&lt;br /&gt;
&lt;br /&gt;
:*  3.1.3 Schlüssellängen bei EC-Verfahren                                        &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.2   SSL/TLS_Versionen                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Only TLSv1.2 allowed (except for ''+tr-02102-''  which also allows            &lt;br /&gt;
:    TLSv1.1)                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.1 Empfohlene Cipher Suites                                                &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Allows only *DHE-*-SHA256, *DHE-*-SHA384, *DH-*-SHA256 and                    &lt;br /&gt;
:    *DH-*-SHA384 ciphers and PSK ciphers with ephermeral keys.                    &lt;br /&gt;
:    For  ''+tr-02102+''  they must be AES-GCM,  ''+tr02102-'' also allows         &lt;br /&gt;
:    AES-CBC.                                                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.3.2 Übergangsregelungen                                                     &lt;br /&gt;
                                                                               &lt;br /&gt;
:    SHA1 temporary allowed. SHA256 and SHA384 recommended.                        &lt;br /&gt;
:    RC4 not reocmmended.                                                          &lt;br /&gt;
:    Use of SHA1 will only be checked for  ''+tr-02102+''&lt;br /&gt;
&lt;br /&gt;
:*  3.4.1 Session Renegotation&lt;br /&gt;
&lt;br /&gt;
:    Only server-side (secure) renegotiation allowed (see RFC5280).&lt;br /&gt;
&lt;br /&gt;
:*  3.4.2 Verkürzung der HMAC-Ausgabe                                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Truncated HMAC according RFC 6066 not recommended.                            &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.3 TLS-Kompression und der CRIME-Angriff                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:    No TLS compression.                                                           &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.4 Der Lucky 13-Angriff                                                    &lt;br /&gt;
:*  3.4.5 Die &amp;quot;Encrypt-thn-MAC&amp;quot;-Erweiterung                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of AES-GCM ciphers only.                                                  &lt;br /&gt;
:    Use of Encrypt-then-MAC according RFC 7366 cannot be checked.                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.6 Die Heartbeat-Erweiterung                                               &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Target must not support the heartbeat extension.                              &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.4.7 Die Extended Master Secret Extension                                    &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of Extended Master Secret Extension according RFC 7627 cannot             &lt;br /&gt;
:    be checked.                                                                   &lt;br /&gt;
                                                                               &lt;br /&gt;
:*  3.5 Authentisierung der Kommunikationspartner                                 &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Not checked as only applicable for VPN connections.&lt;br /&gt;
&lt;br /&gt;
:*  3.6 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:    Check if signature key is &amp;gt; 2000 bits.&lt;br /&gt;
&lt;br /&gt;
:*  3.6.1 Verwendung von elliptischen Kurven                                      &lt;br /&gt;
                                                                               &lt;br /&gt;
:    **NOT YET IMPLEMENTED**                                                       &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use only following curves according RFC 5639 and RFC 7027:                    &lt;br /&gt;
:    brainpoolP256r1, brainpoolP384r1, brainpoolP512r1                             &lt;br /&gt;
                                                                               &lt;br /&gt;
:    Use of secp256r1 and secp384r1  temporary allowed.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Schlüsselspeicherung&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.1 Umgang mit Ephemeralschlüsseln&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:*  4.3 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:    This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======BSI TR-03116-4 (''+tr-03116+'' ''+tr-03116-'' ''+bsi'')======&lt;br /&gt;
:Checks if connection and ciphers are compliant according TR-03116-4,&lt;br /&gt;
:see https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen &lt;br /&gt;
:/TechnischeRichtlinien/TR03116/BSI-TR-03116-4.pdf?__blob=publicationFile&lt;br /&gt;
&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:Allows only TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.2 Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Cipher suites must be ECDHE-ECDSA or -RSA with AES128 and SHA265. &lt;br /&gt;
:For curiosity, stronger cipher suites with AES256 and/or SHA384 are&lt;br /&gt;
:not not allowed. To follow this curiosity the ''+bsi-tr-03116-'' (lazy)&lt;br /&gt;
:check allows the stronger cipher suites ;-)&lt;br /&gt;
&lt;br /&gt;
:* 2.1.1 TLS-Versionen und Sessions&lt;br /&gt;
&lt;br /&gt;
:The TLS session lifetime must not exceed 2 days.&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.2 Encrypt-then-MAC-Extension&lt;br /&gt;
&lt;br /&gt;
:* 2.1.4.3 OCSP-Stapling&lt;br /&gt;
&lt;br /&gt;
:MUST have &amp;lt;code&amp;gt;OCSP Stapling URL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.1 Zertifizierungsstellen/Vertrauensanker&lt;br /&gt;
&lt;br /&gt;
:Certificate must provide all root CAs. (NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Should use a small certificate trust chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.2 Zertifikate&lt;br /&gt;
&lt;br /&gt;
:Must have &amp;lt;code&amp;gt;CRLDistributionPoint&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AuthorityInfoAccess&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:End-user certificate must not be valid longer than 3 years.&lt;br /&gt;
:Root-CA certificate must not be valid longer than 5 years.&lt;br /&gt;
&lt;br /&gt;
:Certificate extension &amp;lt;code&amp;gt;pathLenConstraint&amp;lt;/code&amp;gt; must exist, and should be&lt;br /&gt;
:a small value (&amp;quot;small&amp;quot; is not defined).&lt;br /&gt;
&lt;br /&gt;
:All certificates must contain the extension &amp;lt;code&amp;gt;KeyUsage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Wildcards for &amp;lt;code&amp;gt;CN&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SubjectAltName&amp;lt;/code&amp;gt; are not allowed&lt;br /&gt;
:in any certificate.&lt;br /&gt;
&lt;br /&gt;
:EV certificates are recommended (NOT YET checked properly).&lt;br /&gt;
&lt;br /&gt;
:* 4.1.3 Zertifikatsverifikation&lt;br /&gt;
&lt;br /&gt;
:Must verify all certificates in the chain down to their root-CA.&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:Certificate must be valid according issue and expire date.&lt;br /&gt;
&lt;br /&gt;
:All Checks must be doen for all certificates in the chain.&lt;br /&gt;
&lt;br /&gt;
:* 4.1.4 Domainparameter und Schlüssellängen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
:* 4 5.2 Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
:This requirement is not testable from remote.&lt;br /&gt;
&lt;br /&gt;
======RFC 2818 (''+rfc2818'')======&lt;br /&gt;
:Check if the FQDN is listed in the certificates &amp;lt;code&amp;gt;subjectAltname&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
======RFC 6125 (''+rfc6125'')======&lt;br /&gt;
:Checks values &amp;lt;code&amp;gt;CommonName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubjectAltname&amp;lt;/code&amp;gt;  of the&lt;br /&gt;
:certificate for:&lt;br /&gt;
:* must all be valid characters for DNS&lt;br /&gt;
:* must not contain more than one wildcards&lt;br /&gt;
:* must not contain invalid wildcards&lt;br /&gt;
:* must not contain invalid IDN characters&lt;br /&gt;
&lt;br /&gt;
======RFC 6797 (''+rfc6797'')======&lt;br /&gt;
: Same as STS header  ''+hsts'' .&lt;br /&gt;
&lt;br /&gt;
======RFC 7525 (''+rfc7525'') ======&lt;br /&gt;
:Checks if connection and ciphers are compliant according RFC 7525.&lt;br /&gt;
:See http://tools.ietf.org/rfc/rfc7525.txt&lt;br /&gt;
:(following headlines are taken from there)&lt;br /&gt;
&lt;br /&gt;
:* 3.1.1.  SSL/TLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:SSLv2 and SSLv3 must not be supportetd.&lt;br /&gt;
:TLSv1 should only be supported if there is no TLSv1.1 or TLSv1.2.&lt;br /&gt;
:Either TLSv1.1 or TLSv1.2 must be supported, prefered is TLSv1.2.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.2.  DTLS Protocol Versions&lt;br /&gt;
&lt;br /&gt;
:DTLSv1 and DTLSv1.1 must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.1.3.  Fallback to Lower Versions&lt;br /&gt;
&lt;br /&gt;
:(check implecitely done by 3.1.1, see above)&lt;br /&gt;
&lt;br /&gt;
:* 3.2.  Strict TLS&lt;br /&gt;
&lt;br /&gt;
:Check if server provides Strict Transport Security.&lt;br /&gt;
:(STARTTLS check NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 3.3.  Compression&lt;br /&gt;
&lt;br /&gt;
:Compression on TLS must not be supported.&lt;br /&gt;
&lt;br /&gt;
:* 3.4.  TLS Session Resumption&lt;br /&gt;
&lt;br /&gt;
:Server must support resumtion and random session tickets.&lt;br /&gt;
:(Randomnes of session tickets implemented YET experimental.)&lt;br /&gt;
&lt;br /&gt;
:Check if ticket is authenticated and encrypted NOT YET IMPLEMENTED.&lt;br /&gt;
&lt;br /&gt;
:* 3.5.  TLS Renegotiation&lt;br /&gt;
&lt;br /&gt;
:Server must support renegotiation.&lt;br /&gt;
&lt;br /&gt;
:* 3.6.  Server Name Indication&lt;br /&gt;
&lt;br /&gt;
:(Check for SNI support implemented experimental.)&lt;br /&gt;
&lt;br /&gt;
:* 4.  Recommendations: Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:* 4.1.  General Guidelines&lt;br /&gt;
:* 4.2.  Recommended Cipher Suites&lt;br /&gt;
&lt;br /&gt;
:Check for recommended ciphers.&lt;br /&gt;
&lt;br /&gt;
:* 4.3.  Public Key Length&lt;br /&gt;
&lt;br /&gt;
:DH parameter must be at least 256 bits or 2048 its with EC.&lt;br /&gt;
:(Check currently, 4/2016, based on openssl which may not provide DH&lt;br /&gt;
: parameters for all ciphers.)&lt;br /&gt;
&lt;br /&gt;
:* 4.5.  Truncated HMAC&lt;br /&gt;
&lt;br /&gt;
:TLS extension &amp;quot;truncated hmac&amp;quot; must not be used.&lt;br /&gt;
&lt;br /&gt;
:* 6.  Security Considerations&lt;br /&gt;
:* 6.1.  Host Name Validation&lt;br /&gt;
&lt;br /&gt;
:Given hostname must matches hostname in certificate's subject.&lt;br /&gt;
&lt;br /&gt;
:* 6.2.  AES-GCM&lt;br /&gt;
:* 6.3.  Forward Secrecy&lt;br /&gt;
:* 6.4.  Diffie-Hellman Exponent Reuse&lt;br /&gt;
:(NOT YET IMPLEMENTED).&lt;br /&gt;
&lt;br /&gt;
:* 6.5.  Certificate Revocation&lt;br /&gt;
&lt;br /&gt;
:OCSP and CRL Distrbution Point in cetificate must be defined.&lt;br /&gt;
&lt;br /&gt;
==== OUTPUT====&lt;br /&gt;
&lt;br /&gt;
:All output is designed to make it  easily parsable by postprocessors.&lt;br /&gt;
:Following rules are used:&lt;br /&gt;
&lt;br /&gt;
:*  Lines for formatting or header lines start with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Lines for verbosity or tracing start with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Errors and warnings start with &amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;, hints start with &amp;lt;code&amp;gt;!!&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Empty lines are comments ;-)&lt;br /&gt;
:*  Label texts end with a separation character; default is  &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  Label and value for all checks are separated by  at least one  TAB  character.&lt;br /&gt;
:*  Texts for additional information are enclosed in  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
:*  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; is used when no proper informations was found or provided.&lt;br /&gt;
&lt;br /&gt;
:    Replace  &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt; by whatever you think is adequate:  &amp;quot;No answer&amp;quot;,&lt;br /&gt;
:    &amp;quot;Not available&amp;quot;,  &amp;quot;Not applicable&amp;quot;,  ...&lt;br /&gt;
&lt;br /&gt;
:  Lines not described above, will have the form (be default):&lt;br /&gt;
         Label for information or check:  TABresult&lt;br /&gt;
&lt;br /&gt;
:  For more details on these lines, please refer to  [[#RESULTS|RESULTS]]  above.&lt;br /&gt;
&lt;br /&gt;
:When used in  ''--legacy=full''  or  ''--legacy=simple''  mode, the output&lt;br /&gt;
:may contain formatting lines for better (human) readability.&lt;br /&gt;
&lt;br /&gt;
===== Errors, Warnings, Hints=====&lt;br /&gt;
:Errors, warnings and hints may be part of the output as needed. While&lt;br /&gt;
:errors and warnings are printed immediately as they occour during the&lt;br /&gt;
:program flow, hints are printed right after the corresponding result.&lt;br /&gt;
&lt;br /&gt;
:Errors and warnings start with a unique 3-digit number.&lt;br /&gt;
&lt;br /&gt;
:Hints print an additional explanation of a specific result.  They are&lt;br /&gt;
:are defined statically in the program code, or can be added on demand&lt;br /&gt;
:by using the option  ''--cfg-hint=KEY=TEXT'' .&lt;br /&gt;
&lt;br /&gt;
===== Postprocessing Output=====&lt;br /&gt;
&lt;br /&gt;
:It is recommended to use the  ''--legacy=quick''  option, if the output&lt;br /&gt;
:should be postprocessed, as it omits the default separation character&lt;br /&gt;
:(&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; , see above) and just uses on single tab character (0x09, \t  or&lt;br /&gt;
:TAB) to separate the label text from the text of the result. Example:&lt;br /&gt;
         Label of the performed checkTABresult&lt;br /&gt;
&lt;br /&gt;
:More examples for postprocessing the output can be found here:&lt;br /&gt;
:    https://github.com/OWASP/O-Saft/blob/master/contrib&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMIZATION====&lt;br /&gt;
:This tools can be customized as follows:&lt;br /&gt;
&lt;br /&gt;
*  Using command line options&lt;br /&gt;
&lt;br /&gt;
:    This is a simple way to redefine  specific settings.  Please  see&lt;br /&gt;
:    [[#CONFIGURATION OPTIONS|CONFIGURATION OPTIONS]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using Configuration file&lt;br /&gt;
&lt;br /&gt;
:    A configuration file can contain multiple configuration settings.&lt;br /&gt;
:    Syntax is simply  KEY=VALUE. Please see [[#CONFIGURATION FILE|CONFIGURATION FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  Using resource files&lt;br /&gt;
&lt;br /&gt;
:    A resource file can contain multiple command line options. Syntax&lt;br /&gt;
:    is the same as for command line options iteself.  Each  directory&lt;br /&gt;
:    may contain its own resource file. Please see  [[#RC-FILE|RC-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using debugging files&lt;br /&gt;
&lt;br /&gt;
:    These files are --nomen est omen-- used for debugging purposes.&lt;br /&gt;
:    However, they can be (mis-)used to redefine all settings too.&lt;br /&gt;
:    Please see  [[#DEBUG-FILE|DEBUG-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
*  Using user specified code&lt;br /&gt;
&lt;br /&gt;
:    This file contains  user specified  program code.  It can also be&lt;br /&gt;
:    (mis-)used to redefine all settings. Please see [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:Customization is done by redefining values in internal data structure&lt;br /&gt;
:which are:  %cfg,  %data,  %checks,  %text,  %scores .&lt;br /&gt;
&lt;br /&gt;
:Unless used in  [[#DEBUG-FILE|DEBUG-FILE]]  or  [[#USER-FILE|USER-FILE]],  there is  no need to know&lt;br /&gt;
:these internal data structures or the names of variables; the options&lt;br /&gt;
:will set the  proper values.  The key names being part of the option,&lt;br /&gt;
:are printed in output with the  ''--trace-key''  option.&lt;br /&gt;
&lt;br /&gt;
:I.g. texts (values) of keys in  %data are those used in output of the&lt;br /&gt;
:&amp;lt;code&amp;gt;Informations&amp;lt;/code&amp;gt; section. Texts of keys in  %checks are used for output&lt;br /&gt;
:in &amp;lt;code&amp;gt;Performed Checks&amp;lt;/code&amp;gt; section.  And texts of keys in  %text  are used&lt;br /&gt;
:for additional information lines or texts (mainly beginning with &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====== Configuration File vs. RC-FILE vs. DEBUG-FILE======&lt;br /&gt;
&lt;br /&gt;
*  CONFIGURATION FILE&lt;br /&gt;
&lt;br /&gt;
:    Configuration Files must be specified with one of the   ''--cfg_*''&lt;br /&gt;
:    options. The specified file can be a valid path. Please note that&lt;br /&gt;
:    only the characters:  a-zA-Z_0-9,.\/()-  are allowed as pathname.&lt;br /&gt;
:    Syntax in configuration file is:  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  where &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is any&lt;br /&gt;
:    key as used in internal data structure.&lt;br /&gt;
:    the keys in output).&lt;br /&gt;
&lt;br /&gt;
*  RC-FILE&lt;br /&gt;
&lt;br /&gt;
:    Resource files are searched for and used automatically.&lt;br /&gt;
:    For details see [[#RC-FILE|RC-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  DEBUG-FILE&lt;br /&gt;
&lt;br /&gt;
:    Debug files are searched for and used automatically. &lt;br /&gt;
:    For details see [[#DEBUG-FILE|DEBUG-FILE]] below.&lt;br /&gt;
&lt;br /&gt;
*  USER-FILE&lt;br /&gt;
&lt;br /&gt;
:    The user program file is included only if the  ''--usr'' option was&lt;br /&gt;
:    used. For details see  [[#USER-FILE|USER-FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION OPTIONS=====&lt;br /&gt;
:Configuration options are used to redefine  texts and labels or score&lt;br /&gt;
:settings used in output. The options are:&lt;br /&gt;
&lt;br /&gt;
:*  ''--cfg-cmd=CMD=LIST''&lt;br /&gt;
:*  ''--cfg-checks=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-data=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-hint=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-text=KEY=TEXT''&lt;br /&gt;
:*  ''--cfg-cipher=CIPHER=TEXT''&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is the key used in the internal data structure, and  &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; is the  &lt;br /&gt;
:value to be set for this key.  Note that unknown keys will be ignored  &lt;br /&gt;
:silently.&lt;br /&gt;
&lt;br /&gt;
:If  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an exiting filename,  all lines from that file are&lt;br /&gt;
:read and set. For details see  [[#CONFIGURATION FILE|CONFIGURATION FILE]]  below.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;CIPHER&amp;lt;/code&amp;gt; must be a valid cipher suite name as shown with:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers&lt;br /&gt;
&lt;br /&gt;
:NOTE that such configuration options should be used before any ''--help''&lt;br /&gt;
:or  ''--help=*''  option, otherwise the changed setting is not visible.&lt;br /&gt;
&lt;br /&gt;
===== CONFIGURATION FILE=====&lt;br /&gt;
&lt;br /&gt;
:Note that the file can contain  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  pairs for any kind of the&lt;br /&gt;
:configuration as given by the  [[#--cfg_CFG|--cfg_CFG]]  option.&lt;br /&gt;
&lt;br /&gt;
:For example when used  with  [[#--cfg_text=FILE|--cfg_text=FILE]] only values for  %text&lt;br /&gt;
:will be set, when used  with  [[#--cfg_data=FILE--cfg_data=FILE]] only values for %data&lt;br /&gt;
:will be set, and so on.  &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;  is not used when  &amp;lt;code&amp;gt;KEY=TEXT&amp;lt;/code&amp;gt;  is an existing&lt;br /&gt;
:filename. Though, it's recommended to use a non-existing key, i.e.:&lt;br /&gt;
:''--cfg-text=my_file=some/path/to/private/file'' .&lt;br /&gt;
&lt;br /&gt;
===== RC-FILE=====&lt;br /&gt;
&lt;br /&gt;
:The rc-file will be searched for in the working directory only.&lt;br /&gt;
&lt;br /&gt;
:The name of the rc-file is the name of the program file prefixed by a&lt;br /&gt;
:&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;  (dot),  for example:  &amp;lt;code&amp;gt;.o-saft.pl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:A  rc-file  can contain any of the commands and options valid for the&lt;br /&gt;
:tool itself. The syntax for them is the same as on command line. Each&lt;br /&gt;
:command or option must be in a single line. Any empty or comment line&lt;br /&gt;
:will be ignored. Comment lines start with  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Note that options with arguments must be used as  &amp;lt;code&amp;gt;KEY=VALUE&amp;lt;/code&amp;gt;  instead&lt;br /&gt;
:of  &amp;lt;code&amp;gt;KEY VALUE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Configurations options must be written like &amp;lt;code&amp;gt;--cfg-CFG=KEY=VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;CFG&amp;lt;/code&amp;gt; is any of:  &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; is&lt;br /&gt;
:any key from internal data structure (see above).&lt;br /&gt;
&lt;br /&gt;
:All commands and options given on command line will  overwrite  those&lt;br /&gt;
:found in the rc-file.&lt;br /&gt;
&lt;br /&gt;
===== DEBUG-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All debugging functionality is defined in ''o-saft-dbx.pm'', which will&lt;br /&gt;
:be searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.  For details see  [[#DEBUG|DEBUG]]  below.&lt;br /&gt;
&lt;br /&gt;
===== USER-FILE=====&lt;br /&gt;
&lt;br /&gt;
:All user functionality is defined in  ''o-saft-usr.pm'',  which will be&lt;br /&gt;
:searched for using paths available in  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.&lt;br /&gt;
&lt;br /&gt;
: Syntax in this file is Perl code.&lt;br /&gt;
&lt;br /&gt;
:All functions defined in  ''o-saft-usr.pm''  are called when the option&lt;br /&gt;
:''--usr''  was given. The functions are defined as empty stub, any code&lt;br /&gt;
:can be inserted as need.  Please see  ''perldoc o-saft-usr.pm''  to see&lt;br /&gt;
:when and how these functions are called.&lt;br /&gt;
&lt;br /&gt;
===== SHELL TWEAKS=====&lt;br /&gt;
&lt;br /&gt;
:Configuring the shell environment where the tool is startet,  must be&lt;br /&gt;
:done before the tools starts.  It is  not really  a task for the tool&lt;br /&gt;
:itself, but it can simplify your life, somehow.&lt;br /&gt;
&lt;br /&gt;
:There exist customizations for some commonly used shells,  please see&lt;br /&gt;
:the files in the &amp;lt;code&amp;gt;./contrib/&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== COMMANDS=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--cfg-cmd=CMD=LIST''  can be used to define own commands.&lt;br /&gt;
:When configuring own commands,  &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must not be  one of the commands&lt;br /&gt;
:listed with  ''--help=intern''  and &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt;  must constist only of digits and&lt;br /&gt;
:letters.&lt;br /&gt;
&lt;br /&gt;
:Examples in  ''.o-saft.pl''  are  ''+preload''  and  ''+ciphercheck'' .&lt;br /&gt;
&lt;br /&gt;
==== CIPHER NAMES====&lt;br /&gt;
&lt;br /&gt;
:While the SSL/TLS protocol uses integer numbers to identify  ciphers,&lt;br /&gt;
:almost all tools use some kind of  `human readable'  texts for cipher&lt;br /&gt;
:names.&lt;br /&gt;
&lt;br /&gt;
:These numbers (which are most likely written  as hex values in source&lt;br /&gt;
:code and documentations) are the only true identifier, and we have to&lt;br /&gt;
:rely on the tools that they use the proper integers.&lt;br /&gt;
&lt;br /&gt;
:As such integer or hex numbers are difficult to handle by humans,  we&lt;br /&gt;
:decided to use human readable texts. Unfortunately no common standard&lt;br /&gt;
:exists how to construct the names and map them to the correct number.&lt;br /&gt;
:Some, but by far not all, oddities are described in [[#Name Rodeo|Name Rodeo]].&lt;br /&gt;
&lt;br /&gt;
:The rules for specifying cipher names are:&lt;br /&gt;
&lt;br /&gt;
:&lt;br /&gt;
:*  1. textual names as defined by IANA (see [IANA])&lt;br /&gt;
:*  2. mapping of names and numbers as defined by IANA (see [IANA])&lt;br /&gt;
:*  3. &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;  are treated the same&lt;br /&gt;
:*  4. abbreviations are allowed, as long as they are unique&lt;br /&gt;
:*  5. beside IANA, openssl's cipher names are preferred&lt;br /&gt;
:*  6. name variants are supported, as long as they are unique&lt;br /&gt;
:*  7. hex numbers can be used&lt;br /&gt;
&lt;br /&gt;
:[IANA]    http://www.iana.org/assignments/tls-parameters/tls-parameters.txt September 2013&lt;br /&gt;
&lt;br /&gt;
:[openssl] ... openssl 1.0.1&lt;br /&gt;
&lt;br /&gt;
:If in any doubt, use  ''+list''  to get an idea about the mapping.&lt;br /&gt;
:Use  ''--help=regex''  to see which regex  are used to handle all these&lt;br /&gt;
:variants herein.&lt;br /&gt;
&lt;br /&gt;
:Mind the traps and dragons with cipher names and what number they are&lt;br /&gt;
:actually mapped to. In particular when  ''--lib'', ''--exe'' or ''--openssl''&lt;br /&gt;
:options are in use. Always use these options with ''+list'' command too.&lt;br /&gt;
&lt;br /&gt;
===== Name Rodeo=====&lt;br /&gt;
&lt;br /&gt;
:As said above, the  SSL/TLS protocol uses integer numbers to identify&lt;br /&gt;
:ciphers, but almost all tools use some kind of  human readable  texts&lt;br /&gt;
:for cipher names. &lt;br /&gt;
&lt;br /&gt;
:For example the cipher commonly known as &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt; is identified&lt;br /&gt;
:by &amp;lt;code&amp;gt;0x020701c0&amp;lt;/code&amp;gt; (in openssl) and has &amp;lt;code&amp;gt;SSL2_DES_192_EDE3_CBC_WITH_SHA&amp;lt;/code&amp;gt;&lt;br /&gt;
:as constant name. A definition is missing in IANA, but there is &lt;br /&gt;
:&amp;lt;code&amp;gt;TLS_RSA_WITH_3DES_EDE_CBC_SHA&amp;lt;/code&amp;gt; .  Thers is also &amp;lt;code&amp;gt;0x000A&amp;lt;/code&amp;gt; for the same&lt;br /&gt;
:cipher &amp;lt;code&amp;gt;DES-CBC3-SHA&amp;lt;/code&amp;gt;. Both are valid, first one when used with SSLv2,&lt;br /&gt;
:and second one when used with SSLv3.&lt;br /&gt;
:It's the responsibility of each tool to map the human readable cipher&lt;br /&gt;
:name to the correct (hex, integer) identifier.&lt;br /&gt;
&lt;br /&gt;
:For example Firefox uses  &amp;lt;code&amp;gt;dhe_dss_des_ede3_sha&amp;lt;/code&amp;gt;,  which is what?&lt;br /&gt;
&lt;br /&gt;
:Furthermore, there are different acronyms for the same thing in use.&lt;br /&gt;
:For example  &amp;lt;code&amp;gt;DHE&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt;  both mean &amp;quot;Ephemeral Diffie-Hellman&amp;quot;.&lt;br /&gt;
:Comments in the ''openssl(1)'' sources mention this. And for curiosity&lt;br /&gt;
:these sources use both in cypher names but allow  &amp;lt;code&amp;gt;EDH&amp;lt;/code&amp;gt; as shortcut&lt;br /&gt;
:only in openssl's &amp;quot;ciphers&amp;quot;  command. Wonder about (up to 1.0.1h):&lt;br /&gt;
    openssl ciphers -V EDH&lt;br /&gt;
    openssl ciphers -V DHE&lt;br /&gt;
    openssl ciphers -V EECDH&lt;br /&gt;
    openssl ciphers -V ECDHE&lt;br /&gt;
&lt;br /&gt;
:Next example is  &amp;lt;code&amp;gt;ADH&amp;lt;/code&amp;gt;  which is also known as  &amp;lt;code&amp;gt;DH_anon&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;DHAnon&amp;lt;/code&amp;gt;&lt;br /&gt;
:or  &amp;lt;code&amp;gt;DHA&amp;lt;/code&amp;gt;  or  &amp;lt;code&amp;gt;ANON_DH&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:You think this is enough? Then have a look how many acronyms are used&lt;br /&gt;
:for  &amp;quot;Tripple DES&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Compared to above, the interchangeable use of  &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;  vs.  &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; in human&lt;br /&gt;
:readable cipher names is just a very simple one. However, see openssl&lt;br /&gt;
:again what following means (returns):&lt;br /&gt;
    openssl ciphers -v RC4-MD5&lt;br /&gt;
    openssl ciphers -v RC4+MD5&lt;br /&gt;
    openssl ciphers -v RC4:-MD5&lt;br /&gt;
    openssl ciphers -v RC4:!MD5&lt;br /&gt;
    openssl ciphers -v RC4!MD5&lt;br /&gt;
&lt;br /&gt;
:Looking at all these oddities, it would be nice to have a common unique&lt;br /&gt;
:naming scheme for cipher names. We have not.  As the SSL/TLS protocol&lt;br /&gt;
:just uses a number, it would be natural to use the number as uniq key&lt;br /&gt;
:for all cipher names, at least as key in our internal sources.&lt;br /&gt;
&lt;br /&gt;
:Unfortunately, the assignment of ciphers to numbers  changed over the&lt;br /&gt;
:years, which means that the same number refers to a  different cipher&lt;br /&gt;
:depending on the standard, and/or tool, or version of a tool you use.&lt;br /&gt;
&lt;br /&gt;
:As a result, we cannot use human readable cipher names as  identifier&lt;br /&gt;
:(aka unique key), as there are  to many aliases  for the same cipher.&lt;br /&gt;
:And also the number  cannot be used  as unique key, as a key may have&lt;br /&gt;
:multiple ciphers assigned.&lt;br /&gt;
&lt;br /&gt;
==== KNOWN PROBLEMS====&lt;br /&gt;
&lt;br /&gt;
:This section describes knwon problems, and known error messages which&lt;br /&gt;
:may occour when using ''o-saft.pl''. This sections can be used as FAQ too &lt;br /&gt;
:as it gives hints and workarounds.&lt;br /&gt;
&lt;br /&gt;
===== Segmentation fault=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes  the program terminates with a  &amp;lt;code&amp;gt;Segmentation fault&amp;lt;/code&amp;gt;.  This&lt;br /&gt;
:mainly happens if the target does not return certificate information.&lt;br /&gt;
:If so, the  ''--no-cert''  option may help.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: empty result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  provided cipher is  not accepted by&lt;br /&gt;
:the server, or the server expects client certificates.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: unknown result from openssl; ignored at ...=====&lt;br /&gt;
&lt;br /&gt;
:This most likely occurs when the  openssl  executable is used with a&lt;br /&gt;
:very slow connection. Typically the reason is a connection timeout.&lt;br /&gt;
:Try to use  ''--timeout=SEC''  option.&lt;br /&gt;
:To get more information, use  ''--v'' ''--v''  and/or  ''--trace''  also.&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: undefined cipher description=====&lt;br /&gt;
&lt;br /&gt;
:May occour if ciphers are checked, but no description is available for&lt;br /&gt;
:them herein. This results in printed cipher checks like:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       &amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:instead of:&lt;br /&gt;
&lt;br /&gt;
         EXP-KRB5-RC4-MD5                no       weak&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; no initial data=====&lt;br /&gt;
===== **WARNING: Can't make a connection to your.tld:443; target ignored=====&lt;br /&gt;
&lt;br /&gt;
:This message occours if the underlaying  SSL library (i.e. libssl.a)&lt;br /&gt;
:was not able to connect to the target. Known observed reasons are:&lt;br /&gt;
:* target does not support SSL protocol on specified port&lt;br /&gt;
:* target expects a client certificate in ClientHello message&lt;br /&gt;
&lt;br /&gt;
:More details why the connection failed can be seen using  ''--trace=2'' .&lt;br /&gt;
&lt;br /&gt;
:If the targets supports SSL, it should be at least possible to check&lt;br /&gt;
:for supported ciphers using  ''+cipherall''  instead of  ''+cipher'' .&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $headers in split ... do_httpx2.al)=====&lt;br /&gt;
&lt;br /&gt;
:The warning message (like follows or similar):&lt;br /&gt;
&lt;br /&gt;
:Use of uninitialized value $headers in split at blib/lib/Net/SSLeay.pm&lt;br /&gt;
:(autosplit into blib/lib/auto/Net/SSLeay/do_httpx2.al) line 1290.&lt;br /&gt;
&lt;br /&gt;
:occurs if the target refused a connection on port 80. &lt;br /&gt;
:This is considered a bug in ''Net::SSLeay''.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-http''  option.&lt;br /&gt;
&lt;br /&gt;
===== invalid SSL_version specified at ... IO/Socket/SSL.pm=====&lt;br /&gt;
&lt;br /&gt;
:This error may occur on systems where a specific  SSL version is not&lt;br /&gt;
:supported. Subject are mainly  SSLv2, SSLv3 TLSv1.3 and DTLSv1.&lt;br /&gt;
:For DTLSv1 the full message looks like:&lt;br /&gt;
       invalid SSL_version specified at C:/programs/perl/perl/vendor/lib/IO/Socket/SSL.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use options like: ''--no-sslv2'' ''--no-sslv3'' ''--no-tlsv13'' ''--no-dtlsv1''&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value $_[0] in length at (eval 4) line 1.=====&lt;br /&gt;
&lt;br /&gt;
:This warning occours with IO::Socket::SSL 1.967, reason is unknown.&lt;br /&gt;
:It seems not to harm functionality, hence no workaround, just ignore.&lt;br /&gt;
&lt;br /&gt;
===== Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm line 430.=====&lt;br /&gt;
&lt;br /&gt;
:Some versions of  IO::Socket::SSL return this error message if  *-MD5&lt;br /&gt;
:ciphers are used with other protocols than SSLv2.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--no-md5-cipher''  option.&lt;br /&gt;
&lt;br /&gt;
===== Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ... =====&lt;br /&gt;
&lt;br /&gt;
:Underlaying library doesn't support the required SSL version.&lt;br /&gt;
:See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--ssl-lazy''  option, or corresponding ''--no-SSL'' option.&lt;br /&gt;
&lt;br /&gt;
===== Read error: Connection reset by peer (,199725) at blib/lib/Net/SSLeay.pm (autosplit into blib/lib/auto/Net/SSLeay/tcp_read_all.al) line 535. =====&lt;br /&gt;
&lt;br /&gt;
:Error reported by some Net::SSLeay versions. Reason may be a timeout.&lt;br /&gt;
:This error cannot be omitted or handled properly.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use same call again (no guarantee, unfortunatelly)&lt;br /&gt;
&lt;br /&gt;
===== Odd number of elements in anonymous hash at Net/SSLinfo.pm line 1613. =====&lt;br /&gt;
&lt;br /&gt;
:This warning from perl have been observed  when the connection to the&lt;br /&gt;
:target to check for supported ciphers cannot be established.&lt;br /&gt;
&lt;br /&gt;
:This message can be ignored.&lt;br /&gt;
&lt;br /&gt;
=====openssl: ...some/path.../libssl.so.1.0.0: no version information available (required by openssl)=====&lt;br /&gt;
&lt;br /&gt;
:Mismatch of  openssl executable  and loaded underlaying library. This&lt;br /&gt;
:most likely happens when options  ''--lib=PATH''  and/or  ''--exe=PATH''  are&lt;br /&gt;
:used. See also  [[#Note on SSL versions|Note on SSL versions]] .&lt;br /&gt;
&lt;br /&gt;
:Hint: use following commands to get information about used libraries:&lt;br /&gt;
   o-saft.pl +version&lt;br /&gt;
   o-saft.pl --v --v +version&lt;br /&gt;
&lt;br /&gt;
===== Integer overflow in hexadecimal number at ...=====&lt;br /&gt;
&lt;br /&gt;
:This error message may occour on  32-bit systems if perl was not com-&lt;br /&gt;
:piled with proper options. I.g. perl automatically converts the value&lt;br /&gt;
:to a floating pont number.&lt;br /&gt;
:Please report a bug with output of following command:&lt;br /&gt;
   o-saft.pl +s_client +dump your.tld&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;&amp;lt;openssl did not return DH Paramter&amp;gt;&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
:Text may be part of a value. This means that all checks according  DH&lt;br /&gt;
:parameters and logkam attack cannot be done.&lt;br /&gt;
&lt;br /&gt;
:Workaround: try to use  --openssl=TOOL  option.&lt;br /&gt;
&lt;br /&gt;
:This text may appears in any of the compliance checks (like +rfc7525)&lt;br /&gt;
:which may be a false positive.  For these checks openssl is also used&lt;br /&gt;
:to get the DH Parameter.&lt;br /&gt;
&lt;br /&gt;
:Workaround: not available yet&lt;br /&gt;
&lt;br /&gt;
=====No output with  +help  and/or  --help=todo =====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems using&lt;br /&gt;
   o-saft.pl +help&lt;br /&gt;
   o-saft.pl --help&lt;br /&gt;
:does not print anything.&lt;br /&gt;
&lt;br /&gt;
:Workaround: use  ''--v''  option.&lt;br /&gt;
   o-saft.pl +help --v&lt;br /&gt;
:or&lt;br /&gt;
   o-saft.pl +help | more&lt;br /&gt;
&lt;br /&gt;
=====Character set (like UTF-8) not recognized in some tools=====&lt;br /&gt;
&lt;br /&gt;
:Some tools do not diplay all characters properly,  i.e. some versions&lt;br /&gt;
:of podviewer. It is not the obligation of this tool to fix well known&lt;br /&gt;
:bugs in other tools. However, we can offer workarounds.&lt;br /&gt;
&lt;br /&gt;
:Workaround: generate the affected output using ''--std-format=*''  options    &lt;br /&gt;
:For example:                                                                 &lt;br /&gt;
    o-saft.pl --no-rc --std-format=raw --help=gen-pod&lt;br /&gt;
&lt;br /&gt;
===== **WARNING: on MSWin32 additional option  --v  required, sometimes ...=====&lt;br /&gt;
&lt;br /&gt;
:On some (mainly Windows-based) systems  this may happen  when calling&lt;br /&gt;
:for example:&lt;br /&gt;
   o-saft.pl --help=FAQ&lt;br /&gt;
:which then may produce:&lt;br /&gt;
   **WARNING: on MSWin32 additional option  --v  required, sometimes ...&lt;br /&gt;
   === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
   === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
   **USAGE: no command given&lt;br /&gt;
   # most common usage: &lt;br /&gt;
     o-saft.pl +info   your.tld&lt;br /&gt;
     o-saft.pl +check  your.tld&lt;br /&gt;
     o-saft.pl +cipher your.tld&lt;br /&gt;
   # for more help use:&lt;br /&gt;
     o-saft.pl --help &lt;br /&gt;
&lt;br /&gt;
:Workaround: use full path to perl.exe, for example&lt;br /&gt;
   C:\Programs\perl\bin\perl.exe o-saft.pl --help=FAQ&lt;br /&gt;
&lt;br /&gt;
===== Performance Problems=====&lt;br /&gt;
&lt;br /&gt;
:There are various reasons when the program responds slow, or seems to&lt;br /&gt;
:hang. Performance issues are most likely a target-side problem.  Most&lt;br /&gt;
:common reasons are (no specific order):&lt;br /&gt;
&lt;br /&gt;
:*  a) DNS resolver problems&lt;br /&gt;
::Try with  ''--no-dns''&lt;br /&gt;
&lt;br /&gt;
:*  b) target does not accept connections for https&lt;br /&gt;
::Try with  ''--no-http''&lt;br /&gt;
&lt;br /&gt;
:*  c) target's certificate is not valid&lt;br /&gt;
::Try with  ''--no-cert''&lt;br /&gt;
&lt;br /&gt;
:*  d) target expects that the client provides a client certificate&lt;br /&gt;
::No option provided yet ...&lt;br /&gt;
&lt;br /&gt;
:*  e) target does not handle Server Name Indication (SNI)&lt;br /&gt;
::Try with  ''--no-sni''&lt;br /&gt;
&lt;br /&gt;
:*  f) use of external openssl(1) executable&lt;br /&gt;
::Use  ''--no-openssl'' &lt;br /&gt;
&lt;br /&gt;
:*  g) target does not respond at all and/or blocks&lt;br /&gt;
::Use  ''--ssl-error'' &lt;br /&gt;
::For a detailed description, please see [[#Connection Problems|Connection Problems]].&lt;br /&gt;
&lt;br /&gt;
:Other options which may help to get closer to the problem's cause:&lt;br /&gt;
:''--trace-time'',  ''--timeout=SEC'',  ''--trace'',  ''--trace-cmd''&lt;br /&gt;
&lt;br /&gt;
:Using  ''--trace=time''   should show following times:                    &lt;br /&gt;
:* DNS:             1 - 10 sec&lt;br /&gt;
:* no SNI:          1 - 10 sec  &lt;br /&gt;
:* connection test: 1 -  5 sec&lt;br /&gt;
:* need_default:    &amp;lt;5 sec&lt;br /&gt;
:* need_cipher:     1 - 60 sec (+cipher with socket)  &lt;br /&gt;
:* need_cipher:     1 - 20 sec (+cipherraw)  &lt;br /&gt;
:* prepare checks:  2 - 20 sec                 &lt;br /&gt;
:* info:            &amp;lt;1 sec      &lt;br /&gt;
:* check:           &amp;lt;1 sec&lt;br /&gt;
&lt;br /&gt;
==== LIMITATIONS====&lt;br /&gt;
&lt;br /&gt;
===== Commands=====&lt;br /&gt;
&lt;br /&gt;
:Some commands cannot be used together with others, for example:&lt;br /&gt;
:''+cipher'',  ''+ciphers'',  ''+list'',  ''+libversion'',  ''+version'',  ''+check'',  ''+help'',&lt;br /&gt;
:''+protocols'' .&lt;br /&gt;
&lt;br /&gt;
:''+quick''  should not be used together with other commands, it returns&lt;br /&gt;
:strange output then.&lt;br /&gt;
&lt;br /&gt;
:''+protocols''  requires  ''openssl(1)'' with support for &amp;lt;code&amp;gt;-nextprotoneg&amp;lt;/code&amp;gt;&lt;br /&gt;
:option. Otherwise the value will be empty.&lt;br /&gt;
&lt;br /&gt;
===== Options=====&lt;br /&gt;
&lt;br /&gt;
:The option  ''--port=PORT''  must preceed  ''--host=HOST''  for a target like&lt;br /&gt;
:''HOST:PORT'' .&lt;br /&gt;
&lt;br /&gt;
:The characters &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; cannot be used for [[#--separator=CHAR|--separator==CHAR]] option.&lt;br /&gt;
&lt;br /&gt;
:Following strings should not be used in any value for options:&lt;br /&gt;
:  &amp;lt;code&amp;gt;+check&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+quick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--header&amp;lt;/code&amp;gt;&lt;br /&gt;
:as they my trigger the  -''--header''  option unintentional.&lt;br /&gt;
&lt;br /&gt;
:The used ''timeout(1)'' command cannot be defined with a full path like&lt;br /&gt;
:''openssl(1)''  can with the  ''--openssl=path/to/openssl''.&lt;br /&gt;
&lt;br /&gt;
:[[#--cfg_text=FILE|--cfg_text=FILE]]  cannot be used to redefine the texts &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt;&lt;br /&gt;
:as used in the output for  ''+cipher''  command.&lt;br /&gt;
&lt;br /&gt;
===== Checks (general)=====&lt;br /&gt;
&lt;br /&gt;
====== +constraints======&lt;br /&gt;
&lt;br /&gt;
:This check is only done for the certificate provided by the target.&lt;br /&gt;
:All other certificate in the chain are not checked.&lt;br /&gt;
&lt;br /&gt;
:This is currently (2018) a limitation in ''o-saft.pl''.&lt;br /&gt;
&lt;br /&gt;
===== Broken pipe=====&lt;br /&gt;
&lt;br /&gt;
:This error message most likely means that the connection to specified&lt;br /&gt;
:target was not possible (firewall or whatever reason).&lt;br /&gt;
&lt;br /&gt;
===== Target Certificate Chain Verification=====&lt;br /&gt;
&lt;br /&gt;
:The systems default capabilities i.e. libssl.so, openssl, are used to&lt;br /&gt;
:verify the target's certificate chain.  Unfortunately various systems&lt;br /&gt;
:have implemented different  approaches and rules how identify and how&lt;br /&gt;
:to report a successful verification.  As a consequence  this tool can&lt;br /&gt;
:only return the  same information about the chain verification as the&lt;br /&gt;
:used underlying tools.  If that information is trustworthy depends on&lt;br /&gt;
:how trustworthy the tools are.&lt;br /&gt;
&lt;br /&gt;
:These limitations apply to following commands:&lt;br /&gt;
&lt;br /&gt;
:*  ''+verify''&lt;br /&gt;
:*  ''+selfsigned''&lt;br /&gt;
&lt;br /&gt;
:Following commands and options are useful to get more information:&lt;br /&gt;
&lt;br /&gt;
:*  ''+chain_verify'', ''+verify'', ''+error_verify'', ''+chain'', ''+s_client''&lt;br /&gt;
:*  ''--ca-file'', ''--ca-path'', ''--ca-depth''&lt;br /&gt;
&lt;br /&gt;
===== User Provided Files=====&lt;br /&gt;
&lt;br /&gt;
:Please note that there cannot be any guarantee that the code provided&lt;br /&gt;
:in the   [[#DEBUG-FILE|DEBUG-FILE]] ''o-saft-usr.pm''  or   [[#USER-FILE|USER-FILE]]  ''o-saft-usr.pm'' &lt;br /&gt;
:will work flawless. Obviously this is the user's responsibility.&lt;br /&gt;
&lt;br /&gt;
===== Problems and Errors=====&lt;br /&gt;
&lt;br /&gt;
:Checking the target for supported ciphers may return that a cipher is&lt;br /&gt;
:not supported by the server  misleadingly.  Reason is most likely  an&lt;br /&gt;
:improper timeout for the connection. See  ''--timeout=SEC''  option.&lt;br /&gt;
&lt;br /&gt;
:If the specified targets accepts connections but does not speak  SSL,&lt;br /&gt;
:the connection will be closed after the system's TCP/IP-timeout. This&lt;br /&gt;
:script will hang (about 2-3 minutes).&lt;br /&gt;
&lt;br /&gt;
:If reverse DNS lookup fails, an error message is returned as hostname,&lt;br /&gt;
:like:  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;gethostbyaddr() failed&amp;lt;/code&amp;gt;&amp;gt;&amp;gt;.&lt;br /&gt;
:Workaround to get rid of this message: use  ''--no-dns''  option.&lt;br /&gt;
&lt;br /&gt;
:All checks for EV are solely based on the information provided by the&lt;br /&gt;
:certificate.&lt;br /&gt;
&lt;br /&gt;
:Some versions of openssl (&amp;lt; 1.x) may not support all required options&lt;br /&gt;
:which results in various error messages or --more worse--  may not be&lt;br /&gt;
:visibale at all. Available functionalitity of openssl will be checked &lt;br /&gt;
:for right at the beginning Proper Warnings and hints are printed.&lt;br /&gt;
:Following table shows the openssl option and how to disbale it within&lt;br /&gt;
:o-saft:&lt;br /&gt;
&lt;br /&gt;
:* -nextprotoneg       ''--no-nextprotoneg''&lt;br /&gt;
:* -reconnect          ''--no-reconnect''&lt;br /&gt;
:* -tlsextdebug        ''--no-tlsextdebug''&lt;br /&gt;
:* -alpn               ''--no-alpn''&lt;br /&gt;
&lt;br /&gt;
===== Connection Problems=====&lt;br /&gt;
&lt;br /&gt;
:Sometimes the connection cannot be established. This may have various&lt;br /&gt;
:reasons.  Unfortunaly this script seems to hang then.  In  particular&lt;br /&gt;
:when checking for ciphers with  ''+cipher''  or  ''+cipherall'' . The reason&lt;br /&gt;
:is most likely that the server does not respond to the TCP/IP request&lt;br /&gt;
:and hence the script closes the connection after the configured time-&lt;br /&gt;
:out (see  ''--timeout=SEC''  option).&lt;br /&gt;
&lt;br /&gt;
:Continous connection attempts  can be inhibited with the  ''--ssl-error''&lt;br /&gt;
:option, which is set by default. Avoiding further connections results&lt;br /&gt;
:in a loss of information and consequentely leading to wrong checks.&lt;br /&gt;
&lt;br /&gt;
:It is a trade-off to wait for all information done accurately,  or to&lt;br /&gt;
:get the results quickly. The logic to stop connecting for ''--ssl-error''&lt;br /&gt;
:can be controlled with following additional options:&lt;br /&gt;
:* --ssl-error-max=CNT     - max. continous errors&lt;br /&gt;
:* --ssl-error-timeout=SEC - timeout when to treat a failure as error&lt;br /&gt;
:* --ssl-error-total=CNT   - max. amount of errors&lt;br /&gt;
&lt;br /&gt;
:This means that no more connections are made when more than&lt;br /&gt;
:* --ssl-error-max errors occour sequentialy&lt;br /&gt;
:or&lt;br /&gt;
:* --ssl-error-total errors occoured&lt;br /&gt;
&lt;br /&gt;
:Examples:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=6&amp;lt;/code&amp;gt;&lt;br /&gt;
:no more connections are made if for example  any sequence of timeouts&lt;br /&gt;
:occour:&lt;br /&gt;
  0 5 2 2                   - --ssl-error-max matches &lt;br /&gt;
  0 1 3 0 0 0 4 1 2 2 2     - --ssl-error-max matches&lt;br /&gt;
  0 5 0 2 0 2 2 0 2 0 2     - --ssl-error-total matches&lt;br /&gt;
&lt;br /&gt;
:This allows to fine-tune the condition when to stop connecting to the&lt;br /&gt;
:target. For example, continous but not consecutive timeouts may indi-&lt;br /&gt;
:cate a bad or instable network connection, but not that the target to&lt;br /&gt;
:be connected blocks. In such a case sequence of timeouts like follows&lt;br /&gt;
:may be observed (assuming &amp;lt;code&amp;gt;--ssl-error-max=3&amp;lt;/code&amp;gt;):&lt;br /&gt;
  0 5 1 2 2 2 4 2 3 2 3 3 3 2&lt;br /&gt;
        ^                 ^____ stop for --ssl-error-timeout=3&lt;br /&gt;
        |______________________ stop for --ssl-error-timeout=2&lt;br /&gt;
&lt;br /&gt;
:On normal (even slow) network connections  dozens of  connections per&lt;br /&gt;
:second are usual, hence the timeout is always  0 or 1.  Based on that&lt;br /&gt;
:experience  ''--ssl-error''  is enabled and set with defaults as follows:&lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-max=5&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-timeout=1&amp;lt;/code&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;--ssl-error-total=10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Poor Systems=====&lt;br /&gt;
&lt;br /&gt;
:Use of  ''openssl(1)'' is disabled by default on Windows due to various&lt;br /&gt;
:performance problems. It needs to be enabled with ''--openssl'' option.&lt;br /&gt;
&lt;br /&gt;
:On Windows the usage of  &amp;lt;code&amp;gt;openssl s_client&amp;lt;/code&amp;gt; needs to be enabled using&lt;br /&gt;
:[[#--s_client|--s_client]] option.&lt;br /&gt;
&lt;br /&gt;
:On Windows it's a pain to specify the path for [[#--openssl=TOO|--openssl=TOOL]] option.&lt;br /&gt;
:Variants are:&lt;br /&gt;
&lt;br /&gt;
:*  --openssl=/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=X:/path/to/openssl.exe&lt;br /&gt;
:*  --openssl=\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=X:\path\to\openssl.exe&lt;br /&gt;
:*  --openssl=\\path\\to\\openssl.exe&lt;br /&gt;
:*  --openssl=X:\\path\\to\\openssl.exe&lt;br /&gt;
&lt;br /&gt;
:You have to fiddle around to find the proper one.&lt;br /&gt;
&lt;br /&gt;
===== Debug and Trace Output=====&lt;br /&gt;
&lt;br /&gt;
: When both  [[#--trace-key|--trace-key]]  and  [[#--trace-cmd|--trace-cmd]]  options are used, output is&lt;br /&gt;
: mixed, obviously. Hint: output for [[#--trace-cmd|--trace-cmd]] always contains &amp;quot;CMD&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
: Any  ''--trace*''  option implies  [[#--trace-time|--trace-time]] .&lt;br /&gt;
&lt;br /&gt;
==== DEPENDENCIES====&lt;br /&gt;
&lt;br /&gt;
:All Perl modules and all  private moduels and files  will be searched&lt;br /&gt;
:for using paths available in the  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  variable.  &amp;lt;code&amp;gt;@INC&amp;lt;/code&amp;gt;  will&lt;br /&gt;
:be prepended by following paths:&lt;br /&gt;
&lt;br /&gt;
:*   .&lt;br /&gt;
:*   ./lib&lt;br /&gt;
:*   INSTALL_PATH&lt;br /&gt;
:*   INSTALL_PATH/lib&lt;br /&gt;
&lt;br /&gt;
:Where  &amp;lt;code&amp;gt;INSTALL_PATH&amp;lt;/code&amp;gt;  is the path where the tool is installed.&lt;br /&gt;
:To see which files have been included use:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version --v --user&lt;br /&gt;
&lt;br /&gt;
===== Perl Modules=====&lt;br /&gt;
&lt;br /&gt;
*  ''IO::Socket::SSL(3pm)''&lt;br /&gt;
*  ''IO::Socket::INET(3pm)''&lt;br /&gt;
*  ''Net::SSLeay(3pm)''&lt;br /&gt;
*  ''Net::SSLinfo''&lt;br /&gt;
*  ''Net::SSLhello''&lt;br /&gt;
&lt;br /&gt;
:Perl modules loaded and used for some options only:&lt;br /&gt;
&lt;br /&gt;
* ''Net::DNS(3pm)''&lt;br /&gt;
* ''Time::Local(3pm)''&lt;br /&gt;
&lt;br /&gt;
===== Additional Files used if requested=====&lt;br /&gt;
&lt;br /&gt;
*  ''.o-saft.pl''&lt;br /&gt;
*  ''o-saft-dbx.pm''&lt;br /&gt;
*  ''o-saft-man.pm''&lt;br /&gt;
*  ''o-saft-usr.pm''&lt;br /&gt;
*  ''o-saft-README''&lt;br /&gt;
*  ''o-saft-docker''&lt;br /&gt;
&lt;br /&gt;
==== INSTALLATION====&lt;br /&gt;
&lt;br /&gt;
:The tool can be installed in any path. It just requres the modules as&lt;br /&gt;
:described in  [[#DEPENDENCIES|DEPENDENCIES]]  above. However, it's recommended that the&lt;br /&gt;
:modules ''Net::SSLhello'' and ''Net::SSLinfo'' are found in the directory&lt;br /&gt;
:&amp;lt;code&amp;gt;./Net/&amp;lt;/code&amp;gt;  where  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  is installed.&lt;br /&gt;
&lt;br /&gt;
:For security reasons, most modern libraries disabled or even removed&lt;br /&gt;
:insecure or &amp;quot;dirty&amp;quot; functionality. As this tool's purpose is to find&lt;br /&gt;
:such insecure settings, functions, etc., it needs these dirty things&lt;br /&gt;
:enabled. What we need is (incomplete list):&lt;br /&gt;
&lt;br /&gt;
:* insecure protocols like SSLv2, SSLv3&lt;br /&gt;
:* more more ciphers enabled, like NULL-MD5, AECDH-NULL-SHA, etc.&lt;br /&gt;
:* some SSL extensions and options&lt;br /&gt;
&lt;br /&gt;
:Therefore we recommend to compile and install at least following:&lt;br /&gt;
&lt;br /&gt;
:* openssl  with SSLv2, SSLv3 and more ciphers enabled&lt;br /&gt;
:* Net::SSLeay  compiled with openssl version as described before.&lt;br /&gt;
&lt;br /&gt;
:Please read the  [[#SECURITY|SECURITY]]  section first before following the install&lt;br /&gt;
:instructions below.&lt;br /&gt;
&lt;br /&gt;
=====OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Currently (since 18.06.18) it is recommend to build openssl using&lt;br /&gt;
    contrib/install_openssl.sh&lt;br /&gt;
&lt;br /&gt;
:Other possibilities are:&lt;br /&gt;
:* compiling openssl using following sources&lt;br /&gt;
::  [https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/]&lt;br /&gt;
::  see  [[#Example: Compile OpenSSL|Example: Compile OpenSSL]],&lt;br /&gt;
:* use any of the precomiled versions provided by https://testssl.sh/&lt;br /&gt;
&lt;br /&gt;
:The sources are available at&lt;br /&gt;
:* [https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip https://github.com/PeterMosmans/openssl/archive/1.0.2-chacha.zip]&lt;br /&gt;
:A precomiled static versions are available at&lt;br /&gt;
:* [https://github.com/drwetter/testssl.sh/tree/master/bin https://github.com/drwetter/testssl.sh/tree/master/bin]&lt;br /&gt;
&lt;br /&gt;
:For all following installation examples we assume:&lt;br /&gt;
:* openssl-1.0.2-chacha.zip or openssl-1.0.2d.tar.gz&lt;br /&gt;
:* /usr/local as bae installation directory&lt;br /&gt;
:* a bourne shell (sh) compatible shell&lt;br /&gt;
&lt;br /&gt;
=====Example: Precompiled OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:Simply download the tarball or zip file for your platform, unpack it,&lt;br /&gt;
:and install (copy) the binaries into a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:OpenSSL can be used from [http://openssl.org/ http://openssl.org/] or, as recommended, from&lt;br /&gt;
:[https://github.com/PeterMosmans/openssl/ https://github.com/PeterMosmans/openssl/] .&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL-chacha'''&lt;br /&gt;
:Compiling and installing the later is as simple as:&lt;br /&gt;
    unzip openssl-1.0.2-chacha.zip&lt;br /&gt;
    cd openssl-1.0.2-chacha&lt;br /&gt;
    ./config --shared -Wl,-rpath=/usr/local/lib&lt;br /&gt;
    make&lt;br /&gt;
    make test&lt;br /&gt;
    make install&lt;br /&gt;
&lt;br /&gt;
:which will install openssl, libssl.so, libcrypto.so  and some include&lt;br /&gt;
:files as well as the include files in  /usr/local/ .&lt;br /&gt;
:The shared version of the libraries are necessary for  Net::SSLeay.&lt;br /&gt;
&lt;br /&gt;
:'''OpenSSL.org'''&lt;br /&gt;
:Building openssl from the offical  openssl.org  sources requires some&lt;br /&gt;
:patching before compiling and installing the libraries and binaries.&lt;br /&gt;
&lt;br /&gt;
:Example with openssl-1.0.2d:&lt;br /&gt;
&lt;br /&gt;
   echo == unpack tarball&lt;br /&gt;
   tar xf openssl-1.0.2d.tar.gz&lt;br /&gt;
   cd openssl-1.0.2d&lt;br /&gt;
 &lt;br /&gt;
   echo == backup files to be modified&lt;br /&gt;
   cp ssl/s2_lib.c{,.bak}&lt;br /&gt;
   cp ssl/s3_lib.c{,.bak}&lt;br /&gt;
   cp ssl/ssl3.h{,.bak}&lt;br /&gt;
   cp ssl/tls1.h{,.bak}&lt;br /&gt;
&lt;br /&gt;
   echo == patch files&lt;br /&gt;
   vi ssl/tls1.h         +/TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES/&lt;br /&gt;
            # define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES  1&lt;br /&gt;
   vi ssl/ssl3.h ssl/s{2,3}_lib.c   +&amp;quot;/# *if 0/&amp;quot;&lt;br /&gt;
            #==&amp;gt; remove all   # if 0  and corresponding  #endif&lt;br /&gt;
            #    except if lines contain:&lt;br /&gt;
            #        _FZA&lt;br /&gt;
            #        /* Fortezza ciphersuite from SSL 3.0&lt;br /&gt;
            #        /* Do not set the compare functions,&lt;br /&gt;
            #        if (s-&amp;gt;shutdown &amp;amp; SSL_SEND_SHUTDOWN)&lt;br /&gt;
&lt;br /&gt;
   echo == configure with static libraries&lt;br /&gt;
   echo omitt the zlib options if zlib-1g-dev is not installed&lt;br /&gt;
   echo omitt the krb5 options if no kerberos libraries available&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2  enable-rc5  enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES \&lt;br /&gt;
       shared&lt;br /&gt;
&lt;br /&gt;
   echo == make binaries and libraries&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
   echo == if you want static binaries and libraries&lt;br /&gt;
   make clean&lt;br /&gt;
   echo same ./config as before but without shared option&lt;br /&gt;
   ./config --prefix=/usr/local --openssldir=/usr/local/ssl \&lt;br /&gt;
       enable-zlib zlib zlib-dynamic enable-ssl2 \&lt;br /&gt;
       enable-krb5 --with-krb5-flavor=MIT \&lt;br /&gt;
       enable-mdc2 enable-md2 enable-rc5 enable-rc2 \&lt;br /&gt;
       enable-cms  enable-ec   enable-ec2m enable-ecdh enable-ecdsa \&lt;br /&gt;
       enable-gost enable-seed enable-idea enable-camellia \&lt;br /&gt;
       enable-rfc3779 enable-ec_nistp_64_gcc_128 \&lt;br /&gt;
       experimental-jpake -fPIC \&lt;br /&gt;
       -DTEMP_GOST_TLS -DTLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES&lt;br /&gt;
   make depend&lt;br /&gt;
   make&lt;br /&gt;
   make test&lt;br /&gt;
   echo next make will overwrite the previously installed dynamic&lt;br /&gt;
   echo shared openssl binary with the static openssl binary&lt;br /&gt;
   make install&lt;br /&gt;
&lt;br /&gt;
=====Example: Compile Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:To enable support for ancient protocol versions,  ''Net::SSLeay'' must be&lt;br /&gt;
:compiled manually after patching 'SSLeay.xs' (see below).&lt;br /&gt;
:Reason is, that  ''Net::SSLeay''  enables some functionality for  SSL/TLS&lt;br /&gt;
:according the identified openssl version. There is, currently (2015),&lt;br /&gt;
:no possibility to enable this functionality  by passing options on to&lt;br /&gt;
:the configuration script &amp;lt;code&amp;gt;perl Makefile.PL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
    echo == unpack tarball&lt;br /&gt;
    tar xf Net-SSLeay-1.72.tar.gz&lt;br /&gt;
    cd Net-SSLeay-1.72&lt;br /&gt;
&lt;br /&gt;
    echo == patch files&lt;br /&gt;
    echo &amp;quot;edit SSLeay.xs and change some #if as described below&amp;quot;&lt;br /&gt;
    env OPENSSL_PREFIX=/usr/local perl Makefile.PL PREFIX=/usr/local \&lt;br /&gt;
          INC=/usr/local/include  DEFINE=-DOPENSSL_BUILD_UNSAFE=1&lt;br /&gt;
    make&lt;br /&gt;
    make install&lt;br /&gt;
    cd /tmp &amp;amp;&amp;amp; o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:SSLeay.xs needs to be changed as follows:&lt;br /&gt;
* search for&lt;br /&gt;
    #ifndef OPENSSL_NO_SSL2&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10000000L&lt;br /&gt;
  &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
  &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
  &lt;br /&gt;
    #ifndef OPENSSL_NO_SSL3&lt;br /&gt;
    #if OPENSSL_VERSION_NUMBER &amp;lt; 0x10002000L&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
 &lt;br /&gt;
    #endif&lt;br /&gt;
    #endif&lt;br /&gt;
* and replace by&lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv2_method()&lt;br /&gt;
 &lt;br /&gt;
    const SSL_METHOD *&lt;br /&gt;
    SSLv3_method()&lt;br /&gt;
&lt;br /&gt;
:Note that  ''Net::SSLeay''  will be installed in &amp;lt;code&amp;gt;/usr/local/&amp;lt;/code&amp;gt; then. This&lt;br /&gt;
:can be adapted to your needs by passing another path to the  &amp;lt;code&amp;gt; PREFIX&amp;lt;/code&amp;gt; &lt;br /&gt;
:and  &amp;lt;code&amp;gt; DESTDIR&amp;lt;/code&amp;gt;   parameter.&lt;br /&gt;
&lt;br /&gt;
:Following command can be used to check  which methods are avilable in         &lt;br /&gt;
:Net::SSLeay, hence above patches can be verified:                             &lt;br /&gt;
                                                                               &lt;br /&gt;
     perl -MLNet::SSLinfo -le print Net::SSLinfo::ssleay_test();&lt;br /&gt;
&lt;br /&gt;
=====Testing OpenSSL=====&lt;br /&gt;
&lt;br /&gt;
:After installation as descibed above finished, openssl may be tested: &lt;br /&gt;
&lt;br /&gt;
    echo already installed openssl (found with PATH environment)&lt;br /&gt;
    openssl ciphers -v&lt;br /&gt;
    openssl ciphers -V -ssl2&lt;br /&gt;
    openssl ciphers -V -ssl3&lt;br /&gt;
    openssl ciphers -V ALL&lt;br /&gt;
    openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
    echo own compiled and installed openssl &lt;br /&gt;
    /usr/local/openssl ciphers -v&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl2&lt;br /&gt;
    /usr/local/openssl ciphers -V -ssl3&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:COMPLEMENTOFALL&lt;br /&gt;
    /usr/local/openssl ciphers -V ALL:eNULL:EXP&lt;br /&gt;
&lt;br /&gt;
The difference should be obvious.&lt;br /&gt;
Note, the commands using  &amp;lt;code&amp;gt;ALL:COMPLEMENTOFALL&amp;lt;/code&amp;gt;  and  &amp;lt;code&amp;gt;ALL:eNULL:EXP&amp;lt;/code&amp;gt;&lt;br /&gt;
should return the same result.&lt;br /&gt;
&lt;br /&gt;
=====Testing Net::SSLeay=====&lt;br /&gt;
&lt;br /&gt;
:As we want to test the separately installed  ''Net::SSLeay'',  it is best&lt;br /&gt;
:to do it with  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  itself:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
:we should see a line similar to follwong at the end of the output:&lt;br /&gt;
&lt;br /&gt;
    Net::SSLeay   1.72  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2/Net/SSLeay.pm&lt;br /&gt;
&lt;br /&gt;
:Now check for supported (known) ciphers:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl ciphers -V&lt;br /&gt;
&lt;br /&gt;
:we should see lines similar to those of the last  &amp;lt;code&amp;gt;/usr/local/openssl&amp;lt;/code&amp;gt;&lt;br /&gt;
:call. However, it should contain more cipher lines.&lt;br /&gt;
&lt;br /&gt;
=====Stand-alone Executable=====&lt;br /&gt;
&lt;br /&gt;
:Some people asked for a stand-alone executable (mainly for Windows).&lt;br /&gt;
:Even Perl is a scripting language there are situations where a stand- &lt;br /&gt;
:alone executable would be nice, for example if the installed perl and&lt;br /&gt;
:its libraries are outdated, or if perl is missing at all.&lt;br /&gt;
&lt;br /&gt;
:Currently (2016) there are following possibilities to generate such a&lt;br /&gt;
:stand-alone executable:&lt;br /&gt;
&lt;br /&gt;
* perl with PAR::Packer module &lt;br /&gt;
      pp -C -c o-saft.pl&lt;br /&gt;
      pp -C -c o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                         -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      pp -C -c checkAllCiphers.pl&lt;br /&gt;
      pp -C -c checkAllCiphers.pl -M Net::DNS&lt;br /&gt;
&lt;br /&gt;
* ActiveState perl with its perlapp&lt;br /&gt;
      perlapp --clean o-saft.pl&lt;br /&gt;
      perlapp --clean o-saft.pl -M Net::DNS -M Net::SSLeay -M IO::Socket \&lt;br /&gt;
                  -M Net::SSLinfo -M Net::SSLhello -M osaft&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl&lt;br /&gt;
      perlapp --clean checkAllCiphers.pl -M Net::DNS -M osaft&lt;br /&gt;
&lt;br /&gt;
* perl2exe from IndigoSTar&lt;br /&gt;
      perl2exe o-saft.pl&lt;br /&gt;
      perl2exe checkAllCiphers.pl&lt;br /&gt;
&lt;br /&gt;
:For details  on building the executable,  for example how to include&lt;br /&gt;
:all required modules, please refer to the documentation of the tool.&lt;br /&gt;
:* http://search.cpan.org/~rschupp/PAR-Packer-1.030/lib/PAR/Packer.pm&lt;br /&gt;
:* http://docs.activestate.com/pdk/6.0/PerlApp.html&lt;br /&gt;
:* http://www.indigostar.com &lt;br /&gt;
&lt;br /&gt;
:Note that  pre-build executables (build by perlapp, perl2exe) cannot &lt;br /&gt;
:be provided due to licence problems.&lt;br /&gt;
:Also note that using stand-alone executable have not been tested the&lt;br /&gt;
:same way as the &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; itself. Use them at your own risk.&lt;br /&gt;
&lt;br /&gt;
==== DOCKER====&lt;br /&gt;
:The tool can be used inside a Docker image. With  ''o-saft-docker'' and a&lt;br /&gt;
:''Dockerfile'' (both are part of the distribution), a proper Docker image&lt;br /&gt;
:will be build easily. o-saft-docker  can also be used to run commands&lt;br /&gt;
:with ''o-saft.pl'' inside the Docker image, example:&lt;br /&gt;
&lt;br /&gt;
   o-saft-docker +info some.tld&lt;br /&gt;
&lt;br /&gt;
:For more details, please refer to:      &lt;br /&gt;
&lt;br /&gt;
   o-saft-docker -help&lt;br /&gt;
   o-saft-docker usage&lt;br /&gt;
&lt;br /&gt;
==== SEE ALSO====&lt;br /&gt;
&lt;br /&gt;
* ''openssl(1)'', ''Net::SSLeay(3pm)'', ''Net::SSLhello'', ''Net::SSLinfo'', ''timeout(1)''&lt;br /&gt;
* http://www.openssl.org/docs/apps/ciphers.html&lt;br /&gt;
* ''IO::Socket::SSL(3pm)'', ''IO::Socket::INET(3pm)''&lt;br /&gt;
* ''o-saft-docker'', ''o-saft-docker-dev'', ''Dockerfile'', ''docker''&lt;br /&gt;
&lt;br /&gt;
==== HACKER's INFO====&lt;br /&gt;
&lt;br /&gt;
=====Note on SSL versions=====&lt;br /&gt;
&lt;br /&gt;
:Automatically detecting the supported SSL versions of the underlaying&lt;br /&gt;
:system is a hard job and not always possible. Reasons could be:&lt;br /&gt;
&lt;br /&gt;
* used Perl modules (''Socket::SSL'', ''Net::SSLeay'') does not handle errors&lt;br /&gt;
:properly. Erros may be:&lt;br /&gt;
   invalid SSL_version specified at ... IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
   Use of uninitialized value in subroutine entry at lib/IO/Socket/SSL.pm&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl does not support the version, which then may&lt;br /&gt;
:result in segmentation fault&lt;br /&gt;
&lt;br /&gt;
* the underlaying libssl is newer than the Perl module and the module&lt;br /&gt;
:has not been reinstalled. This most often happens with  ''Net::SSLeay''&lt;br /&gt;
:This can be detected with (see version numbers for  ''Net::SSLeay''):&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
&lt;br /&gt;
* perl (in particular a used module, see above)  may bail out with a&lt;br /&gt;
:compile error, like&lt;br /&gt;
    Can't locate auto/Net/SSLeay/CTX_v2_new.al in @INC ...&lt;br /&gt;
&lt;br /&gt;
:We try to detect unsupported versions and disable them automatically,&lt;br /&gt;
:a warning like follwoing is shown then:&lt;br /&gt;
    **WARNING: SSL version &amp;lt;code&amp;gt;SSLv2&amp;lt;/code&amp;gt; not supported by openssl&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:may help to to get closer to the reason or can be used as workaround:&lt;br /&gt;
    o-saft.pl +version&lt;br /&gt;
    o-saft.pl +version | grep versions&lt;br /&gt;
    o-saft.pl +version | grep 0x&lt;br /&gt;
    o-saft.pl +protocols your.tld&lt;br /&gt;
    o-saft.pl +protocols your.tld --no-rc&lt;br /&gt;
&lt;br /&gt;
:If problems occour with  SSL versions, following commands and options&lt;br /&gt;
:Checking for SSL version is done at one place in the code, search for&lt;br /&gt;
     supported SSL versions&lt;br /&gt;
&lt;br /&gt;
===== Using private libssl.so and libcrypt.so=====&lt;br /&gt;
&lt;br /&gt;
:For all  cryptographic functionality  the libraries  installed on the&lt;br /&gt;
:system will be used. This is in particular Perl's  ''Net:SSLeay'' module,&lt;br /&gt;
:the system's  ''libssl.so'' and ''libcrypt.so''  and the ''openssl'' executable.&lt;br /&gt;
&lt;br /&gt;
:It is possible to provide your own libraries, if the  P module and&lt;br /&gt;
:the executable are  linked using  dynamic shared objects  (aka shared&lt;br /&gt;
:library, position independent code).&lt;br /&gt;
:The appropriate option is  ''--lib=PATH''  .&lt;br /&gt;
&lt;br /&gt;
:On most systems these libraries are loaded at startup of the program.&lt;br /&gt;
:The runtime loader uses a preconfigured list of directories  where to&lt;br /&gt;
:find these libraries. Also most systems provide a special environment&lt;br /&gt;
:variable to specify  additional paths  to directories where to search&lt;br /&gt;
:for libraries, for example the  &amp;lt;code&amp;gt;LD_LIBRARY_&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
:This is the default environment variable used herein.  If your system&lt;br /&gt;
:uses  another name it must be specified with the  ''--envlibvar=NAME''&lt;br /&gt;
:option, where  &amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt;  is the name of the environment variable.&lt;br /&gt;
&lt;br /&gt;
===== Understanding  ''--exe=PATH'', ''--lib=PATH'', ''--openssl=FILE''=====&lt;br /&gt;
&lt;br /&gt;
:If any of [[#--exe=PATH|--exe=PATH]] or [[#--lib=PATH|--lib=PATH]] is provided, the pragram calls&lt;br /&gt;
:(&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;) itself recursively with all given options, except the option&lt;br /&gt;
:itself. The environment variables  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  and &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  are&lt;br /&gt;
:set before executing as follows:&lt;br /&gt;
&lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--exe=PATH|--exe=PATH]] &lt;br /&gt;
:*  prepend  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  with all values given with  [[#--lib=PATH|--lib=PATH]] &lt;br /&gt;
&lt;br /&gt;
:This is exactly, what [[#Cumbersome Approach|Cumbersome Approach]] below describes. So these&lt;br /&gt;
:option simply provide a shortcut for that.&lt;br /&gt;
&lt;br /&gt;
:Note that [[#--openssl=TOOL|--openssl=TOOL]] is a full path to the ''openssl'' executable&lt;br /&gt;
:and will not be changed.  However, if it is a relative path, it might&lt;br /&gt;
:be searched for using the previously set  &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;  (see above).&lt;br /&gt;
&lt;br /&gt;
:Note that  &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt;  is the default.  It can be changed with&lt;br /&gt;
:the  [[#--envlibvar=NAME|--envlibvar=NAME]]  option.&lt;br /&gt;
&lt;br /&gt;
:While  ''--exe''  mainly impacts the openssl executable,  ''--lib''  also&lt;br /&gt;
:impacts o-saft.pl itself, as it loads other shared libraries if found.&lt;br /&gt;
&lt;br /&gt;
:Bear in mind that  all these options  can affect the behaviour of the&lt;br /&gt;
:openssl subsystem,  influencing both which  executable is called  and&lt;br /&gt;
:which shared libraries will be used.&lt;br /&gt;
&lt;br /&gt;
:NOTE that no checks are done if the options are set proper. To verify&lt;br /&gt;
:the settings, following commands may be used:&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v +version&lt;br /&gt;
    o-saft.pl --lib=YOU-PATH --exe=YOUE-EXE --v --v +version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Why so many options?  Exactly as described above, these options allow&lt;br /&gt;
:the users to tune the behaviour of the tool to their needs.  A common&lt;br /&gt;
:use case is to enable the use of a separate openssl build independent&lt;br /&gt;
:of the openssl package used by the operating system.  This allows the&lt;br /&gt;
:user fine grained control over openssl's encryption suites  which are&lt;br /&gt;
:compiled/available, without affecting the core system.&lt;br /&gt;
&lt;br /&gt;
===== Caveats=====&lt;br /&gt;
&lt;br /&gt;
:Depending on your system and the used modules and executables, it can&lt;br /&gt;
:be tricky to replace the configured shared libraries with own ones.&lt;br /&gt;
:Reasons are:&lt;br /&gt;
:  a) the linked library name contains a version number,&lt;br /&gt;
:  b) the linked library uses a fixed path,&lt;br /&gt;
:  c) the linked library is searched at a predefined path,&lt;br /&gt;
:  d) the executable checks the library version when loaded.&lt;br /&gt;
&lt;br /&gt;
:Only the first one a) can be circumvented.  The last one d) can often&lt;br /&gt;
:be ignored as it only prints a warning or error message.&lt;br /&gt;
&lt;br /&gt;
:To circumvent the &amp;quot;name with version number&amp;quot; problem try following:&lt;br /&gt;
&lt;br /&gt;
*  1. use ''ldd'' (or a similar tool) to get the names used by ''openssl'':&lt;br /&gt;
&lt;br /&gt;
:  ldd /usr/bin/openssl&lt;br /&gt;
&lt;br /&gt;
:which returns something like:&lt;br /&gt;
&lt;br /&gt;
:  libssl.so.0.9.8 =&amp;gt; /lib/libssl.so.0.9.8 (0x00007f940cb6d000)&lt;br /&gt;
:  libcrypto.so.0.9.8 =&amp;gt; /lib/libcrypto.so.0.9.8 (0x00007f940c7de000)&lt;br /&gt;
:  libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f940c5d9000)&lt;br /&gt;
:  libz.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libz.so.1 (0x00007f940c3c1000)&lt;br /&gt;
:  libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f940c02c000)&lt;br /&gt;
:  /lib64/ld-linux-x86-64.so.2 (0x00007f940cdea000)&lt;br /&gt;
&lt;br /&gt;
:Here only the first two libraries are important.  Both,  libcrypto.so&lt;br /&gt;
:and libssl.so  need to be version &amp;quot;0.9.8&amp;quot; (in this example).&lt;br /&gt;
&lt;br /&gt;
*  2. create a directory for your libraries, i.e.:&lt;br /&gt;
&lt;br /&gt;
:  mkdir /tmp/dada&lt;br /&gt;
&lt;br /&gt;
*  3. place your libraries there, assuming they are:&lt;br /&gt;
&lt;br /&gt;
:  /tmp/dada/libssl.so.1.42&lt;br /&gt;
:  /tmp/dada/libcrypto.so.1.42&lt;br /&gt;
&lt;br /&gt;
*  4. create symbolic links in that directory:&lt;br /&gt;
&lt;br /&gt;
:  ln -s libssl.so.1.42    libssl.so.0.9.8&lt;br /&gt;
:  ln -s libcrypto.so.1.42 libcrypto.so.0.9.8&lt;br /&gt;
&lt;br /&gt;
*  5. test program with following option:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada&lt;br /&gt;
&lt;br /&gt;
:  or:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +libversion --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
    o-saft.pl +list --v   --lib=/tmp/dada -exe=/path/to-openssl&lt;br /&gt;
&lt;br /&gt;
*  6. start program with your options, i.e.:&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --lib=/tmp/dada +ciphers&lt;br /&gt;
&lt;br /&gt;
:This works if ''openssl(1)'' uses the same shared libraries as&lt;br /&gt;
:''Net:SSLeay(1)'', which most likely is the case.&lt;br /&gt;
&lt;br /&gt;
:It's tested with Unix/Linux only. It may work on other platforms also&lt;br /&gt;
:if they support such an environment variable and the installed&lt;br /&gt;
:''Net::SSLeay(1)''  and ''openssl(1)''  are linked using dynamic shared&lt;br /&gt;
:objects.&lt;br /&gt;
&lt;br /&gt;
:Depending on  compile time settings  and/or  the location of the used&lt;br /&gt;
:tool or lib, a warning like following may occur:&lt;br /&gt;
&lt;br /&gt;
   WARNING: can't open config file: /path/to/openssl/ssl/openssl.cnf&lt;br /&gt;
&lt;br /&gt;
:This warning can be ignored, usually as  ''req''  or  ''ca''  sub commands of&lt;br /&gt;
:openssl is not used here. &lt;br /&gt;
:To fix the problem, either use  ''--openssl-cnf=FILE''  option or set the&lt;br /&gt;
:the environment variable OPENSSL_CONF properly.&lt;br /&gt;
&lt;br /&gt;
====== Cumbersome Approach======&lt;br /&gt;
&lt;br /&gt;
:A more cumbersome approach to call  this program is to set  following&lt;br /&gt;
:environment variables in your shell:&lt;br /&gt;
&lt;br /&gt;
   PATH=/tmp/dada-1.42/apps:$PATH&lt;br /&gt;
   LD_LIBRARY_PATH=/tmp/dada-1.42&lt;br /&gt;
&lt;br /&gt;
====== Windows Caveats======&lt;br /&gt;
&lt;br /&gt;
:I.g. the used libraries on Windows are ''libeay32.dll'' and ''ssleay32.dll''.&lt;br /&gt;
&lt;br /&gt;
:Windows also supports the &amp;lt;code&amp;gt;LD_LIBRARY_PATH&amp;lt;/code&amp;gt; environment variable. If it&lt;br /&gt;
:does not work as expected with that variable, it might be possible to&lt;br /&gt;
:place the libs in the same directory as the  corresponding executable&lt;br /&gt;
:(which is found by the &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; environment variable).&lt;br /&gt;
&lt;br /&gt;
===== Using CGI mode=====&lt;br /&gt;
&lt;br /&gt;
:This script can be used as  CGI application. Output is the same as in&lt;br /&gt;
:common CLI mode, using  'Content-Type:text/plain'.  Keep in mind that&lt;br /&gt;
:the used modules like  ''Net::SSLeay''  will write some debug messages&lt;br /&gt;
:on STDERR instead STDOUT. Therefore multiple  ''--v'' and/or  ''--trace''&lt;br /&gt;
:options behave slightly different.&lt;br /&gt;
&lt;br /&gt;
:No additional external files like [[#RC-FILE|RC-FILE]] or  [[#DEBUG-FILE|DEBUG-FILE]] are read&lt;br /&gt;
:in CGI mode; they are silently ignored.&lt;br /&gt;
:Some options are disabled in CGI mode  because they are dangerous  or&lt;br /&gt;
:don't make any sense.&lt;br /&gt;
&lt;br /&gt;
====== WARNING======&lt;br /&gt;
&lt;br /&gt;
:  There are  no  input data validation checks implemented herein. All &lt;br /&gt;
:  input data is url-decoded once and then used verbatim.&lt;br /&gt;
:  More advanced checks must be done outside before calling this tool.&lt;br /&gt;
&lt;br /&gt;
:It's not recommended to run this tool in CGI mode.&lt;br /&gt;
:You have been warned!&lt;br /&gt;
&lt;br /&gt;
===== Using user specified code=====&lt;br /&gt;
&lt;br /&gt;
:There are some functions called within the program flow, which can be&lt;br /&gt;
:filled with any Perl code.  Empty stubs of the functions are prepared&lt;br /&gt;
:in  ''o-saft-usr.pm''.  See also  [[#USER-FILE|USER-FILE]].&lt;br /&gt;
&lt;br /&gt;
==== DEBUG====&lt;br /&gt;
&lt;br /&gt;
===== Debugging, Tracing=====&lt;br /&gt;
&lt;br /&gt;
:Following  options and commands  are useful for hunting problems with&lt;br /&gt;
:SSL connections and/or this tool. Note that some options can be given&lt;br /&gt;
:multiple times to increase amount of listed information. Also keep in&lt;br /&gt;
:mind that it's best to specify  ''--v''  as very first argument.&lt;br /&gt;
&lt;br /&gt;
:Note that the file  ''o-saft-dbx.pm''  is required, if any  ''--trace*''&lt;br /&gt;
:or  ''--v''  option is used.&lt;br /&gt;
&lt;br /&gt;
====== Commands======&lt;br /&gt;
&lt;br /&gt;
*  ''+dump''&lt;br /&gt;
*  ''+libversion''&lt;br /&gt;
*  ''+s_client''&lt;br /&gt;
*  ''+todo''&lt;br /&gt;
*  ''+version''&lt;br /&gt;
&lt;br /&gt;
====== Options======&lt;br /&gt;
&lt;br /&gt;
*  ''--v''&lt;br /&gt;
*  ''--v--''&lt;br /&gt;
*  ''--trace''&lt;br /&gt;
*  ''--trace-arg''&lt;br /&gt;
*  ''--trace-cmd''&lt;br /&gt;
*  ''--trace-key''&lt;br /&gt;
&lt;br /&gt;
:Empty or undefined strings are written as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;undefined&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;  in texts.&lt;br /&gt;
:Some parameters, in particular those of  HTTP responses,  are written&lt;br /&gt;
:as  &amp;lt;code&amp;gt;&amp;lt;&amp;lt;response&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;.  Long parameter lists are abbreviated with &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====== Output======&lt;br /&gt;
&lt;br /&gt;
:When using  ''--v''  and/or  ''--trace''  options, additional output will&lt;br /&gt;
:be prefixed with a  &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;  (mainly as first, left-most character.&lt;br /&gt;
:Following formats are used:&lt;br /&gt;
&lt;br /&gt;
:*  #[space]&lt;br /&gt;
&lt;br /&gt;
:    Addition text for verbosity (''--v'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #[variable name][TAB]&lt;br /&gt;
&lt;br /&gt;
:    Internal variable name (''--trace-key'' options).&lt;br /&gt;
&lt;br /&gt;
:*  #o-saft.pl::&lt;br /&gt;
:*  #Net::SSLinfo::&lt;br /&gt;
&lt;br /&gt;
:    Trace information for ''--trace''  options.&lt;br /&gt;
&lt;br /&gt;
:*  #{&lt;br /&gt;
&lt;br /&gt;
:    Trace information from  &amp;lt;code&amp;gt;NET::SSLinfo&amp;lt;/code&amp;gt;  for  ''--trace''  options.&lt;br /&gt;
:    These are data lines in the format:   #{ variable name : value #}&lt;br /&gt;
:    Note that  &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;  here can span multiple lines and ends with #}&lt;br /&gt;
&lt;br /&gt;
====== Using outdated modules======&lt;br /&gt;
&lt;br /&gt;
:The tools was designed to work with old Perl modules too.  When using&lt;br /&gt;
:old modules, a proper  &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt;  will be printed. These warinings&lt;br /&gt;
:cannot be switched of using  --no-warning  .&lt;br /&gt;
:The warning also informs about the missing functionality or check.&lt;br /&gt;
&lt;br /&gt;
:I.g. it is best to install newer versions of the module if possible.&lt;br /&gt;
:A good practice to check if modules are available in a proper version&lt;br /&gt;
:is to call:&lt;br /&gt;
&lt;br /&gt;
  o-saft.pl +version&lt;br /&gt;
  o-saft.pl +version --v --v&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result without warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      === reading: Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      === ./o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x268443744&lt;br /&gt;
             ::SSLeay()                    0x268443744&lt;br /&gt;
          Net::SSLeay::SSLeay_version()    OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 1.0.2-chacha (1.0.2f-dev)&lt;br /&gt;
          external executable              /opt/openssl-chacha/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries         &lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /opt/tools/openssl-chacha/ssl/certs&lt;br /&gt;
          PEM format file with CAs         /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs \&lt;br /&gt;
                                            /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt \&lt;br /&gt;
                                           certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      177&lt;br /&gt;
          openssl supported SSL versions   SSLv3 TLSv1 TLSv11 TLSv12&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF, \&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
                                           &lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib . /bin /usr/share/perl5 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl5/5.20 \&lt;br /&gt;
                               /usr/lib/x86_64-linux-gnu/perl/5.20 \&lt;br /&gt;
                               /usr/share/perl/5.20 /usr/local/lib/site_perl .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.35     /usr/lib/x86_64-linux-gnu/perl/5.20/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        2.002    /usr/share/perl5/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.81     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.72     /usr/lib/x86_64-linux-gnu/perl5/5.20/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Following example shows the result with warnings:&lt;br /&gt;
&lt;br /&gt;
      === reading: ./.o-saft.pl (RC-FILE done) ===&lt;br /&gt;
      === reading: ./Net/SSLhello.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49; cannot use ::initialize at /Net/SSLinfo.pm line 481.&lt;br /&gt;
      === reading: ./Net/SSLinfo.pm (O-Saft module done) ===&lt;br /&gt;
      **WARNING: ancient perl has no 'version' module; version checks may not be accurate; at o-saft.pl line 1662.&lt;br /&gt;
      **WARNING: ancient Net::SSLeay 1.35 &amp;lt; 1.49 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient IO::Socket::SSL 1.22 &amp;lt; 1.37 detected; at o-saft.pl line 1687.&lt;br /&gt;
      **WARNING: ancient version IO::Socket::SSL 1.22 &amp;lt; 1.90 does not support SNI or is known to be buggy; SNI disabled; at o-saft.pl line 5905.&lt;br /&gt;
      !!Hint: --force-openssl can be used to disables this check&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49  may throw warnings and/or results may be missing; at o-saft.pl line 5934.&lt;br /&gt;
      **WARNING: SSL version 'TLSv11': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv12': not supported by Net::SSLeay; not checked&lt;br /&gt;
      **WARNING: SSL version 'TLSv13': not supported by Net::SSLeay; not checked&lt;br /&gt;
      === o-saft.pl 16.09.09 ===&lt;br /&gt;
          Net::SSLeay::&lt;br /&gt;
             ::OPENSSL_VERSION_NUMBER()    0x9470143&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
             ::SSLeay()                    0x1.35&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; detailed version not available at o-saft.pl line 4806.&lt;br /&gt;
      = openssl =&lt;br /&gt;
          version of external executable   OpenSSL 0.9.8y 5 Feb 2013&lt;br /&gt;
          external executable              /usr/bin/openssl&lt;br /&gt;
          used environment variable (name) LD_LIBRARY_PATH&lt;br /&gt;
          environment variable (content)   &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          path to shared libraries&lt;br /&gt;
          full path to openssl.cnf file    &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common openssl.cnf files         /usr/lib/ssl/openssl.cnf \&lt;br /&gt;
                                           /etc/ssl/openssl.cnf \&lt;br /&gt;
                                           /System//Library/OpenSSL/openssl.cnf \&lt;br /&gt;
                                           /usr/ssl/openssl.cnf&lt;br /&gt;
          URL where to find CRL file       &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          directory with PEM files for CAs /System/Library/OpenSSL/certs&lt;br /&gt;
          PEM format file with CAs         &amp;lt;&amp;lt;undef&amp;gt;&amp;gt;&lt;br /&gt;
          common paths to PEM files for CAs /etc/ssl/certs /usr/lib/certs /System/Library/OpenSSL&lt;br /&gt;
          common PEM filenames for CAs     ca-certificates.crt certificates.crt certs.pem&lt;br /&gt;
          number of supported ciphers      43&lt;br /&gt;
          openssl supported SSL versions   SSLv2 SSLv3 TLSv1&lt;br /&gt;
          o-saft.pl known SSL versions     SSLv2 SSLv3 TLSv1 TLSv11 TLSv12 TLSv13 \&lt;br /&gt;
                                           DTLSv09 DTLSv1 DTLSv11 DTLSv12 DTLSv13&lt;br /&gt;
      **WARNING: ancient version Net::SSLeay 1.35 &amp;lt; 1.49; cannot compare SSLeay with openssl version at o-saft.pl line 4778.&lt;br /&gt;
      **WARNING: used openssl version '9470143' differs from compiled Net:SSLeay '1.35'; ignored&lt;br /&gt;
      = o-saft.pl +cipherall =&lt;br /&gt;
          default list of ciphers          0x03000000 .. 0x030000FF, 0x0300C000 .. 0x0300C0FF,&lt;br /&gt;
                                           0x0300CC00 .. 0x0300CCFF, 0x0300FE00 .. 0x0300FFFF,&lt;br /&gt;
      = Required (and used) Modules =&lt;br /&gt;
          @INC                 ./ ./lib /bin /Library/Perl/Updates/5.10.0 \&lt;br /&gt;
                               /System/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /Network/Library/Perl/5.10.0 \&lt;br /&gt;
                               /Network/Library/Perl \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level \&lt;br /&gt;
                               /System/Library/Perl/Extras/5.10.0 .&lt;br /&gt;
      =   module name            VERSION  found in&lt;br /&gt;
      =   ----------------------+--------+------------------------------------------&lt;br /&gt;
          IO::Socket::INET       1.31     /System/Library/Perl/5.10.0/darwin-thread-multi-2level/IO/Socket/INET.pm&lt;br /&gt;
          IO::Socket::SSL        1.22     /System/Library/Perl/Extras/5.10.0/IO/Socket/SSL.pm&lt;br /&gt;
          Net::DNS               0.65     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/DNS.pm&lt;br /&gt;
          Net::SSLeay            1.35     /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/Net/SSLeay.pm&lt;br /&gt;
          Net::SSLinfo           16.06.01 ./Net/SSLinfo.pm&lt;br /&gt;
          Net::SSLhello          16.05.16 ./Net/SSLhello.pm&lt;br /&gt;
          osaft                  16.05.10 /osaft.pm&lt;br /&gt;
&lt;br /&gt;
:Please keep in mind that the shown version numbers and the shown line  &lt;br /&gt;
:numbers are examples and may differ on your system.&lt;br /&gt;
&lt;br /&gt;
:When starting &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; with outdated modules, more &amp;lt;code&amp;gt;**WARNING:&amp;lt;/code&amp;gt; will  &lt;br /&gt;
:be shown. The warnings depend on the installed version of the module.  &lt;br /&gt;
:&amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; is known to work with at least:                                     &lt;br /&gt;
:* ''IO::Socket::INET'' 1.31, ''IO::Socket::SSL'' 1.22, ''Net::DNS'' 0.66, ''Net::SSLeay'' 1.30&lt;br /&gt;
&lt;br /&gt;
====TESTING====&lt;br /&gt;
:When talking about &amp;quot;testing the tool&amp;quot;, functionl tests are meant.  So&lt;br /&gt;
:this section describes &amp;quot;developer&amp;quot; rather than &amp;quot;user&amp;quot; options.&lt;br /&gt;
&lt;br /&gt;
:Testing the tool is a challenging task. Beside the oddities described&lt;br /&gt;
:elsewhere, for example  [[#Name Rodeo|Name Rodeo]],  there are a bunch of problems&lt;br /&gt;
:and error which may occour during runtime.&lt;br /&gt;
&lt;br /&gt;
:Makefiles are used for testing  functionality and code quality during&lt;br /&gt;
:development. These tests are implemented in the  &amp;lt;code&amp;gt;./t/&amp;lt;/code&amp;gt;  directory, see&lt;br /&gt;
:the &amp;lt;code&amp;gt;Makefile.*&amp;lt;/code&amp;gt; there.&lt;br /&gt;
&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt; are available to improve&lt;br /&gt;
:testing.  They mainly can simulate error conditions or stop execution&lt;br /&gt;
:properly (they are not intended for other use cases):&lt;br /&gt;
&lt;br /&gt;
======+quit======&lt;br /&gt;
&lt;br /&gt;
:Stop execution after processing all arguments and before precessing&lt;br /&gt;
:any target. The runtime configuration is complete at this point.&lt;br /&gt;
&lt;br /&gt;
======--exit=KEY======&lt;br /&gt;
&lt;br /&gt;
:Terminate  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  at specified &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;.  For available &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; please see:&lt;br /&gt;
    o-saft.pl --help=exit&lt;br /&gt;
    grep exit= o-saft.pl&lt;br /&gt;
&lt;br /&gt;
======--cfg-init=KEY=VALUE======&lt;br /&gt;
:With this option values in the internal  %cfg  hash can be set:&lt;br /&gt;
&lt;br /&gt;
    $cfg{KEY} = VALUE&lt;br /&gt;
&lt;br /&gt;
:Only (perl) scalars or arrays can be set. The type will be detected&lt;br /&gt;
:automatically.&lt;br /&gt;
&lt;br /&gt;
:Example,  this option can be used to change the text used as prefix&lt;br /&gt;
:in each output line triggerd by the  ''--v''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_verbose=&amp;quot;#VERBOSE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
:or the text used as prefix triggerd by the  ''--trace''  option:&lt;br /&gt;
    o-saft.pl --cfg-init=prefix_trace=&amp;quot;#TRACE: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
======--v======&lt;br /&gt;
:Print more information about checks.&lt;br /&gt;
&lt;br /&gt;
======--trace======&lt;br /&gt;
:Print debugging messages.&lt;br /&gt;
&lt;br /&gt;
:For more details, please see  [[#Options for tracing and debugging|Options for tracing and debugging]] .&lt;br /&gt;
&lt;br /&gt;
=====Internal testing=====&lt;br /&gt;
:Following options and commands for  &amp;lt;code&amp;gt;o-saft.pl&amp;lt;/code&amp;gt;  are for internal testing.&lt;br /&gt;
:They provide informations about internal data structures and alike.&lt;br /&gt;
:See also tests in t/Makefile* .&lt;br /&gt;
&lt;br /&gt;
======--test-data======&lt;br /&gt;
:Print overview of all available commands and checks.&lt;br /&gt;
&lt;br /&gt;
======--test-prot======&lt;br /&gt;
:Print internal data according protocols.&lt;br /&gt;
&lt;br /&gt;
======--test-regex======&lt;br /&gt;
:Print results for applying various texts to defined regex.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-list======&lt;br /&gt;
:Print list of hex keys of known ciphers.&lt;br /&gt;
&lt;br /&gt;
======--test-cipher-sorted======&lt;br /&gt;
:Print list of ciphers sorted according strength.&lt;br /&gt;
&lt;br /&gt;
==== EXAMPLES====&lt;br /&gt;
&lt;br /&gt;
:($0 in all following examples is the name of the tool)&lt;br /&gt;
&lt;br /&gt;
===== General=====&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld&lt;br /&gt;
    o-saft.pl +info   some.tld&lt;br /&gt;
    o-saft.pl +check  some.tld&lt;br /&gt;
    o-saft.pl +quick  some.tld&lt;br /&gt;
    o-saft.pl +help=commands&lt;br /&gt;
    o-saft.pl +list&lt;br /&gt;
    o-saft.pl +list --v&lt;br /&gt;
    o-saft.pl +certificate  some.tld&lt;br /&gt;
    o-saft.pl +fingerprint  some.tld 444&lt;br /&gt;
    o-saft.pl +after +dates some.tld&lt;br /&gt;
&lt;br /&gt;
===== Some Specials=====&lt;br /&gt;
&lt;br /&gt;
*  Get an idea how messages look like&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check --cipher=RC4 some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for Server Name Indication (SNI) usage only&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for SNI and print certificate's subject and altname&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni +cn +altname some.tld&lt;br /&gt;
&lt;br /&gt;
*  Check for all SNI, certificate's subject and altname issues&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +sni_check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --enabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Only print unsupported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --disabled some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test for a specific ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --cipher=ADH-AES256-SHA some.tld&lt;br /&gt;
&lt;br /&gt;
* Test all ciphers, even if not supported by local SSL implementation&lt;br /&gt;
    o-saft.pl +cipherraw some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld&lt;br /&gt;
    o-saft.pl +cipherall some.tld --range=full&lt;br /&gt;
    checkAllCiphers.pl example.tld --range=full --v&lt;br /&gt;
&lt;br /&gt;
* Show supported (enabled) ciphers with their DH parameters:&lt;br /&gt;
    o-saft.pl +cipher-dh some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private libssl.so, libcrypto.so and openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --lib=/foo/bar-1.42 --exe=/foo/bar-1.42/apps some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Test using a private openssl also for testing supported ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher --openssl=/foo/bar-1.42/openssl --force-openssl some.tld&lt;br /&gt;
&lt;br /&gt;
*  Show current score settings&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score&lt;br /&gt;
&lt;br /&gt;
*  Change a single score setting&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --cfg_score=http_https=42   +check some.tld &lt;br /&gt;
&lt;br /&gt;
*  Use your private score settings from a file&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=score &amp;gt; magic.score&lt;br /&gt;
:    # edit as needed: magic.score&lt;br /&gt;
    o-saft.pl --cfg_score    magic.score  +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld --cfg_text=desc=&amp;lt;code&amp;gt;my special description&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Use your private texts from RC-FILE&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --help=cfg_text &amp;gt;&amp;gt; .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
:    # edit as needed:     .o-saft.pl&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +check some.tld&lt;br /&gt;
&lt;br /&gt;
* Use your private hint texts in output&lt;br /&gt;
    o-saft.pl +check some.tld --cfg-hint=renegotiation=&amp;quot;my special hint text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Get the certificate's Common Name for a bunch of servers:&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld&lt;br /&gt;
    o-saft.pl +cn example.tld some.tld other.tld --showhost --no-header&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header +check some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +info  some.tld&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key +check some.tld&lt;br /&gt;
&lt;br /&gt;
*  Generate simple parsable output for multiple hosts&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl --legacy=quick --no-header --trace-key --showhost +check some.tld other.tld&lt;br /&gt;
&lt;br /&gt;
*  Just for curiosity&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +fingerprint --format=raw&lt;br /&gt;
    o-saft.pl some.tld +certificate --format=raw | openssl x509 -noout -fingerprint&lt;br /&gt;
&lt;br /&gt;
===== Testing with exit code=====&lt;br /&gt;
* Test SSL/TLS connection and return exit code&lt;br /&gt;
    o-saft.pl +check  --exitcode  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code with details about exit code&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-v  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test ciphers and return exit code for ciphers only&lt;br /&gt;
    o-saft.pl +cipher --exitcode --exitcode-no-prot  some.tld&lt;br /&gt;
&lt;br /&gt;
* Test with exit code but avoid checks considered 'yes' even if 'no'&lt;br /&gt;
    o-saft.pl +check  --exitcode --ignore-out=ev- --ignore-out=rfc_7525 some.tld&lt;br /&gt;
&lt;br /&gt;
===== Specials for hunting problems with connections etc.=====&lt;br /&gt;
&lt;br /&gt;
*  Show command line argument processing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-arg&lt;br /&gt;
&lt;br /&gt;
*  Simple tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace&lt;br /&gt;
    o-saft.pl +info some.tld --trace&lt;br /&gt;
&lt;br /&gt;
*  A bit more tracing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cn   some.tld --trace --trace&lt;br /&gt;
&lt;br /&gt;
* Show internal variable names in output&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-key&lt;br /&gt;
&lt;br /&gt;
* Show internal argument processeing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info --trace-arg some.tld&lt;br /&gt;
&lt;br /&gt;
* Show internal control flow&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
* Show internal timing&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --trace-time&lt;br /&gt;
&lt;br /&gt;
* Show checking ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v&lt;br /&gt;
&amp;lt;!-- following no longer implemented (8/2016)&lt;br /&gt;
*  List checked ciphers one per line&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v -v&lt;br /&gt;
&lt;br /&gt;
*  Show processing of ciphers&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +cipher some.tld --v --v --v -v&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  Show values retrieved from target certificate directly&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-cert --no-cert --no-cert-text=Value-from-Certificate&lt;br /&gt;
&lt;br /&gt;
*  Show certificate CA verifications&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl some.tld +chain_verify +verify +error_verify +chain&lt;br /&gt;
&lt;br /&gt;
*  Avoid most performance and timeout problems (don't use  --v)&lt;br /&gt;
&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --ignore-no-conn&lt;br /&gt;
    o-saft.pl +info some.tld --no-dns --no-sni --no-cert --no-http --no-openssl&lt;br /&gt;
&lt;br /&gt;
* Identify timeout problems&lt;br /&gt;
                                       &lt;br /&gt;
    o-saft.pl +info some.tld --trace-cmd&lt;br /&gt;
&lt;br /&gt;
this will show lines containing:&lt;br /&gt;
&lt;br /&gt;
     #O-Saft  CMD: test ...&lt;br /&gt;
&lt;br /&gt;
==== ATTRIBUTION====&lt;br /&gt;
&lt;br /&gt;
:Based on ideas (in alphabetical order) of:&lt;br /&gt;
:   cnark.pl, SSLAudit.pl sslscan, ssltest.pl, sslyze.py, testssl.sh&lt;br /&gt;
&lt;br /&gt;
:O-Saft - OWASP SSL advanced forensic tool&lt;br /&gt;
:   Thanks to Gregor Kuznik for this title.&lt;br /&gt;
&lt;br /&gt;
: ''cipherraw'' and most proxy functionality implemented by Torsten Gigler.&lt;br /&gt;
&lt;br /&gt;
:For re-writing some docs in proper English, thanks to Robb Watson.&lt;br /&gt;
&lt;br /&gt;
:Code to check heartbleed vulnerability adapted from&lt;br /&gt;
:   Steffen Ullrich (08. April 2014):&lt;br /&gt;
:   https://github.com/noxxi/p5-scripts/blob/master/check-ssl-heartbleed.pl&lt;br /&gt;
&lt;br /&gt;
:Colouration inspired by https://testssl.sh/ .&lt;br /&gt;
&lt;br /&gt;
==== AUTHOR====&lt;br /&gt;
&lt;br /&gt;
[[User:achim|Achim Hoffmann]]&lt;br /&gt;
&lt;br /&gt;
==== VERSION====&lt;br /&gt;
&lt;br /&gt;
:@(#) 16.09.16&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Content of this wiki page generated with:&lt;br /&gt;
 o-saft.pl --no-warning --no-header --help=gen-wiki&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Achim</name></author>	</entry>

	</feed>